mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
Herb's warning fixes. Also the POSIX locking fix.
We now use our own vfs layer to do get/set acl calls (hurrah!).
Jeremy.
(This used to be commit dfe77c7046
)
This commit is contained in:
parent
08657e539e
commit
ba00796e6d
@ -635,12 +635,7 @@ extern int errno;
|
||||
|
||||
#include "msdfs.h"
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
#include "profile.h"
|
||||
#else
|
||||
#define START_PROFILE(x)
|
||||
#define END_PROFILE(x)
|
||||
#endif
|
||||
|
||||
#ifndef MAXCODEPAGELINES
|
||||
#define MAXCODEPAGELINES 256
|
||||
|
@ -22,6 +22,14 @@
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
* Reasons for cache flush.
|
||||
*/
|
||||
|
||||
#define NUM_FLUSH_REASONS 8 /* Keep this in sync with the enum below. */
|
||||
enum flush_reason_enum { SEEK_FLUSH, READ_FLUSH, WRITE_FLUSH, READRAW_FLUSH,
|
||||
OPLOCK_RELEASE_FLUSH, CLOSE_FLUSH, SYNC_FLUSH, SIZECHANGE_FLUSH };
|
||||
|
||||
/* this file defines the profile structure in the profile shared
|
||||
memory area */
|
||||
|
||||
@ -308,19 +316,61 @@ struct profile_struct {
|
||||
|
||||
|
||||
extern struct profile_struct *profile_p;
|
||||
extern struct timeval profile_starttime;
|
||||
extern struct timeval profile_endtime;
|
||||
extern BOOL do_profile_flag;
|
||||
|
||||
#define INC_PROFILE_COUNT(x) if (profile_p) profile_p->x++
|
||||
#define DEC_PROFILE_COUNT(x) if (profile_p) profile_p->x--
|
||||
#define ADD_PROFILE_COUNT(x,y) if (profile_p) profile_p->x += (y)
|
||||
/* these are helper macros - do not call them directly in the code
|
||||
* use the DO_PROFILE_* START_PROFILE and END_PROFILE ones
|
||||
* below which test for the profile flage first
|
||||
*/
|
||||
#define INC_PROFILE_COUNT(x) profile_p->x++
|
||||
#define DEC_PROFILE_COUNT(x) profile_p->x--
|
||||
#define ADD_PROFILE_COUNT(x,y) profile_p->x += (y)
|
||||
#define PROFILE_TIME TvalDiff(&profile_starttime,&profile_endtime)
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
#define DO_PROFILE_INC(x) \
|
||||
if (do_profile_flag) { \
|
||||
INC_PROFILE_COUNT(x); \
|
||||
}
|
||||
#define DO_PROFILE_DEC(x) \
|
||||
if (do_profile_flag) { \
|
||||
DEC_PROFILE_COUNT(x); \
|
||||
}
|
||||
#define DO_PROFILE_DEC_INC(x,y) \
|
||||
if (do_profile_flag) { \
|
||||
DEC_PROFILE_COUNT(x); \
|
||||
INC_PROFILE_COUNT(y); \
|
||||
}
|
||||
#define DO_PROFILE_ADD(x,n) \
|
||||
if (do_profile_flag) { \
|
||||
ADD_PROFILE_COUNT(x,n); \
|
||||
}
|
||||
#define START_PROFILE(x) \
|
||||
struct timeval starttime; \
|
||||
struct timeval endtime; \
|
||||
GetTimeOfDay(&starttime); \
|
||||
INC_PROFILE_COUNT(x##_count)
|
||||
|
||||
#define END_PROFILE(y) \
|
||||
GetTimeOfDay(&endtime); \
|
||||
ADD_PROFILE_COUNT((y##_time),TvalDiff(&starttime,&endtime))
|
||||
if (do_profile_flag) { \
|
||||
GetTimeOfDay(&profile_starttime); \
|
||||
INC_PROFILE_COUNT(x##_count); \
|
||||
}
|
||||
#define START_PROFILE_BYTES(x,n) \
|
||||
if (do_profile_flag) { \
|
||||
GetTimeOfDay(&profile_starttime); \
|
||||
INC_PROFILE_COUNT(x##_count); \
|
||||
ADD_PROFILE_COUNT(x##_bytes,n); \
|
||||
}
|
||||
#define END_PROFILE(x) \
|
||||
if (do_profile_flag) { \
|
||||
GetTimeOfDay(&profile_endtime); \
|
||||
ADD_PROFILE_COUNT(x##_time,PROFILE_TIME); \
|
||||
}
|
||||
#else
|
||||
#define DO_PROFILE_INC(x)
|
||||
#define DO_PROFILE_DEC(x)
|
||||
#define DO_PROFILE_DEC_INC(x,y)
|
||||
#define DO_PROFILE_ADD(x,n)
|
||||
#define START_PROFILE(x)
|
||||
#define START_PROFILE_BYTES(x,n)
|
||||
#define END_PROFILE(x)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -3793,7 +3793,6 @@ int sslutil_negotiate_ssl(int fd, int msg_type);
|
||||
|
||||
/*The following definitions come from smbd/statcache.c */
|
||||
|
||||
void print_stat_cache_statistics(void);
|
||||
void stat_cache_add( char *full_orig_name, char *orig_translated_path);
|
||||
BOOL stat_cache_lookup(connection_struct *conn, char *name, char *dirpath,
|
||||
char **start, SMB_STRUCT_STAT *pst);
|
||||
@ -3834,7 +3833,7 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd);
|
||||
/*The following definitions come from smbd/vfs-wrap.c */
|
||||
|
||||
int vfswrap_dummy_connect(connection_struct *conn, char *service, char *user);
|
||||
void vfswrap_dummy_disconnect(void);
|
||||
void vfswrap_dummy_disconnect(connection_struct *conn);
|
||||
SMB_BIG_UINT vfswrap_disk_free(connection_struct *conn, char *path, BOOL small_query, SMB_BIG_UINT *bsize,
|
||||
SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize);
|
||||
DIR *vfswrap_opendir(connection_struct *conn, char *fname);
|
||||
@ -3860,6 +3859,9 @@ char *vfswrap_getwd(connection_struct *conn, char *path);
|
||||
int vfswrap_utime(connection_struct *conn, char *path, struct utimbuf *times);
|
||||
int vfswrap_ftruncate(files_struct *fsp, int fd, SMB_OFF_T offset);
|
||||
BOOL vfswrap_lock(files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type);
|
||||
size_t vfswrap_fget_nt_acl(files_struct *fsp, int fd, SEC_DESC **ppdesc);
|
||||
size_t vfswrap_get_nt_acl(files_struct *fsp, char *name, SEC_DESC **ppdesc);
|
||||
BOOL vfswrap_fset_nt_acl(files_struct *fsp, int fd, uint32 security_info_sent, SEC_DESC *psd);
|
||||
|
||||
/*The following definitions come from smbd/vfs.c */
|
||||
|
||||
|
@ -617,13 +617,6 @@ struct current_user
|
||||
NT_USER_TOKEN *nt_user_token;
|
||||
};
|
||||
|
||||
/*
|
||||
* Reasons for cache flush.
|
||||
*/
|
||||
|
||||
#define NUM_FLUSH_REASONS 8 /* Keep this in sync with the enum below. */
|
||||
enum flush_reason_enum { SEEK_FLUSH, READ_FLUSH, WRITE_FLUSH, READRAW_FLUSH,
|
||||
OPLOCK_RELEASE_FLUSH, CLOSE_FLUSH, SYNC_FLUSH, SIZECHANGE_FLUSH };
|
||||
/* Defines for the sent_oplock_break field above. */
|
||||
#define NO_BREAK_SENT 0
|
||||
#define EXCLUSIVE_BREAK_SENT 1
|
||||
|
@ -78,9 +78,9 @@ struct vfs_ops {
|
||||
BOOL (*lock)(struct files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type);
|
||||
|
||||
size_t (*fget_nt_acl)(struct files_struct *fsp, int fd, struct security_descriptor_info **ppdesc);
|
||||
size_t (*get_nt_acl)(struct connection_struct *conn, char *name, struct security_descriptor_info **ppdesc);
|
||||
size_t (*get_nt_acl)(struct files_struct *fsp, char *name, struct security_descriptor_info **ppdesc);
|
||||
BOOL (*fset_nt_acl)(struct files_struct *fsp, int fd, uint32 security_info_sent, struct security_descriptor_info *psd);
|
||||
BOOL (*set_nt_acl)(struct connection_struct *conn, char *name, uint32 security_info_sent, struct security_descriptor_info *psd);
|
||||
BOOL (*set_nt_acl)(struct files_struct *fsp, char *name, uint32 security_info_sent, struct security_descriptor_info *psd);
|
||||
};
|
||||
|
||||
struct vfs_options {
|
||||
|
@ -693,7 +693,6 @@ static int euc3sjis (int hi, int lo, BOOL is_3byte)
|
||||
}
|
||||
}
|
||||
}
|
||||
return ((GETAHI << 8) | GETALO);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
|
@ -408,7 +408,7 @@ static BOOL does_lock_overlap(SMB_OFF_T start1, SMB_OFF_T size1, SMB_OFF_T start
|
||||
if (start1 >= start2 && start1 <= start2 + size2)
|
||||
return True;
|
||||
|
||||
if (start1 < start2 && start1 + size1 > start2);
|
||||
if (start1 < start2 && start1 + size1 > start2)
|
||||
return True;
|
||||
|
||||
return False;
|
||||
|
@ -22,7 +22,6 @@
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
#include <sys/shm.h>
|
||||
|
||||
extern int DEBUGLEVEL;
|
||||
@ -34,6 +33,11 @@ static BOOL read_only;
|
||||
|
||||
struct profile_struct *profile_p;
|
||||
|
||||
BOOL do_profile_flag = False;
|
||||
|
||||
struct timeval profile_starttime;
|
||||
struct timeval profile_endtime;
|
||||
|
||||
/*******************************************************************
|
||||
open the profiling shared memory area
|
||||
******************************************************************/
|
||||
@ -99,10 +103,7 @@ BOOL profile_setup(BOOL rdonly)
|
||||
DEBUG(3,("Initialised profile area\n"));
|
||||
}
|
||||
|
||||
do_profile_flag = True; /* temp for now */
|
||||
return True;
|
||||
}
|
||||
|
||||
#else
|
||||
/* to keep compilers happy about empty modules */
|
||||
void profile_dummy(void) {}
|
||||
#endif
|
||||
|
@ -679,7 +679,7 @@ uint32 spoolss_getprinterdata(const POLICY_HND *hnd, const UNISTR2 *valuename,
|
||||
|
||||
DEBUG(5,("SPOOLSS Get Printer data)\n"));
|
||||
|
||||
make_spoolss_q_getprinterdata(&q_o, hnd, valuename, in_size);
|
||||
make_spoolss_q_getprinterdata(&q_o, hnd,(UNISTR2 *)valuename, in_size);
|
||||
|
||||
/* turn parameters into data stream */
|
||||
if (spoolss_io_q_getprinterdata("", &q_o, &buf, 0) &&
|
||||
|
@ -172,7 +172,7 @@ static struct cli_use *cli_find(const char *srv_name,
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!reuse && !pwd_compare(&usr_creds->pwd, &c->cli->pwd))
|
||||
if (!reuse && !pwd_compare((struct pwd_info *)&usr_creds->pwd, &c->cli->pwd))
|
||||
{
|
||||
DEBUG(100, ("password doesn't match\n"));
|
||||
continue;
|
||||
|
@ -391,7 +391,7 @@ uint32 msrpc_spoolss_getprinterdata( const char* printer_name,
|
||||
init_buffer(buffer, size, mem_ctx);
|
||||
|
||||
status = spoolss_getprinterdata(&hnd, &uni_val_name, size, type, &size,
|
||||
data, &needed);
|
||||
(unsigned char *)data, &needed);
|
||||
|
||||
if (status == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
@ -400,7 +400,7 @@ uint32 msrpc_spoolss_getprinterdata( const char* printer_name,
|
||||
data = prs_data_p(&buffer->prs);
|
||||
status = spoolss_getprinterdata(&hnd, &uni_val_name,
|
||||
size, type, &size,
|
||||
data, &needed);
|
||||
(unsigned char *)data, &needed);
|
||||
}
|
||||
|
||||
if (mem_ctx)
|
||||
|
@ -77,7 +77,7 @@ static BOOL ncacn_np_establish_connection(struct ncacn_np *cli,
|
||||
return False;
|
||||
}
|
||||
/* if (!cli_nt_session_open(cli->smb, pipe_name, &cli->fnum)) by JERRY */
|
||||
if (!cli_nt_session_open(cli->smb, pipe_name))
|
||||
if (!cli_nt_session_open(cli->smb, (char *)pipe_name))
|
||||
{
|
||||
cli_net_use_del(srv_name, ntc, False, NULL);
|
||||
return False;
|
||||
@ -331,7 +331,7 @@ static struct ncacn_np_use *ncacn_np_find(const char *srv_name,
|
||||
continue;
|
||||
}
|
||||
if (!reuse
|
||||
&& !pwd_compare(&usr_creds->pwd, &c->cli->smb->pwd))
|
||||
&& !pwd_compare((struct pwd_info *)&usr_creds->pwd, &c->cli->smb->pwd))
|
||||
{
|
||||
DEBUG(100, ("password doesn't match\n"));
|
||||
continue;
|
||||
|
@ -358,16 +358,14 @@ static BOOL set_printer_hnd_printertype(Printer_entry *Printer, char *handlename
|
||||
if (!strchr(handlename+2, '\\')) {
|
||||
DEBUGADD(4,("Printer is a print server\n"));
|
||||
Printer->printer_type = PRINTER_HANDLE_IS_PRINTSERVER;
|
||||
return True;
|
||||
}
|
||||
/* it's a printer */
|
||||
else {
|
||||
DEBUGADD(4,("Printer is a printer\n"));
|
||||
Printer->printer_type = PRINTER_HANDLE_IS_PRINTER;
|
||||
return True;
|
||||
}
|
||||
|
||||
return False;
|
||||
return True;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -83,9 +83,7 @@ BOOL read_from_write_cache(files_struct *fsp,char *data,SMB_OFF_T pos,size_t n)
|
||||
|
||||
memcpy(data, wcp->data + (pos - wcp->offset), n);
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_read_hits);
|
||||
#endif
|
||||
DO_PROFILE_INC(writecache_read_hits);
|
||||
|
||||
return True;
|
||||
}
|
||||
@ -183,9 +181,9 @@ ssize_t write_file(files_struct *fsp, char *data, SMB_OFF_T pos, size_t n)
|
||||
}
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_total_writes);
|
||||
DO_PROFILE_INC(writecache_total_writes);
|
||||
if (!fsp->oplock_type) {
|
||||
INC_PROFILE_COUNT(writecache_non_oplock_writes);
|
||||
DO_PROFILE_INC(writecache_non_oplock_writes);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -296,9 +294,7 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n",
|
||||
#endif
|
||||
|
||||
if(!wcp) {
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_direct_writes);
|
||||
#endif
|
||||
DO_PROFILE_INC(writecache_direct_writes);
|
||||
return real_write_file(fsp, data, pos, n);
|
||||
}
|
||||
|
||||
@ -350,9 +346,7 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n",
|
||||
pos += data_used;
|
||||
n -= data_used;
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_abutted_writes);
|
||||
#endif
|
||||
DO_PROFILE_INC(writecache_abutted_writes);
|
||||
total_written = data_used;
|
||||
|
||||
write_path = 1;
|
||||
@ -388,9 +382,7 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n",
|
||||
|
||||
cache_flush_needed = True;
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_abutted_writes);
|
||||
#endif
|
||||
DO_PROFILE_INC(writecache_abutted_writes);
|
||||
total_written = data_used;
|
||||
|
||||
write_path = 2;
|
||||
@ -460,9 +452,7 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n",
|
||||
pos += data_used;
|
||||
n -= data_used;
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_abutted_writes);
|
||||
#endif
|
||||
DO_PROFILE_INC(writecache_abutted_writes);
|
||||
total_written = data_used;
|
||||
|
||||
write_path = 3;
|
||||
@ -494,9 +484,7 @@ len = %u\n",fsp->fd, (double)pos, (unsigned int)n, (double)wcp->offset, (unsigne
|
||||
if ( n <= wcp->alloc_size && n > wcp->data_size) {
|
||||
cache_flush_needed = True;
|
||||
} else {
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_direct_writes);
|
||||
#endif
|
||||
DO_PROFILE_INC(writecache_direct_writes);
|
||||
return real_write_file(fsp, data, pos, n);
|
||||
}
|
||||
|
||||
@ -525,9 +513,7 @@ n = %u, wcp->offset=%.0f, wcp->data_size=%u\n",
|
||||
if (n > wcp->alloc_size ) {
|
||||
if(real_write_file(fsp, data, pos, n) == -1)
|
||||
return -1;
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_direct_writes);
|
||||
#endif
|
||||
DO_PROFILE_INC(writecache_direct_writes);
|
||||
return total_written + n;
|
||||
}
|
||||
|
||||
@ -538,17 +524,15 @@ n = %u, wcp->offset=%.0f, wcp->data_size=%u\n",
|
||||
if (n) {
|
||||
#ifdef WITH_PROFILE
|
||||
if (wcp->data_size) {
|
||||
INC_PROFILE_COUNT(writecache_abutted_writes);
|
||||
DO_PROFILE_INC(writecache_abutted_writes);
|
||||
} else {
|
||||
INC_PROFILE_COUNT(writecache_init_writes);
|
||||
DO_PROFILE_INC(writecache_init_writes);
|
||||
}
|
||||
#endif
|
||||
memcpy(wcp->data+wcp->data_size, data, n);
|
||||
if (wcp->data_size == 0) {
|
||||
wcp->offset = pos;
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_num_write_caches);
|
||||
#endif
|
||||
DO_PROFILE_INC(writecache_num_write_caches);
|
||||
}
|
||||
wcp->data_size += n;
|
||||
DEBUG(9,("cache return %u\n", (unsigned int)n));
|
||||
@ -573,9 +557,7 @@ void delete_write_cache(files_struct *fsp)
|
||||
if(!(wcp = fsp->wcp))
|
||||
return;
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
DEC_PROFILE_COUNT(writecache_allocated_write_caches);
|
||||
#endif
|
||||
DO_PROFILE_DEC(writecache_allocated_write_caches);
|
||||
allocated_write_caches--;
|
||||
|
||||
SMB_ASSERT(wcp->data_size == 0);
|
||||
@ -621,9 +603,7 @@ static BOOL setup_write_cache(files_struct *fsp, SMB_OFF_T file_size)
|
||||
}
|
||||
|
||||
fsp->wcp = wcp;
|
||||
#ifdef WITH_PROFILE
|
||||
INC_PROFILE_COUNT(writecache_allocated_write_caches);
|
||||
#endif
|
||||
DO_PROFILE_INC(writecache_allocated_write_caches);
|
||||
allocated_write_caches++;
|
||||
|
||||
DEBUG(10,("setup_write_cache: File %s allocated write cache size %u\n",
|
||||
@ -659,17 +639,14 @@ ssize_t flush_write_cache(files_struct *fsp, enum flush_reason_enum reason)
|
||||
data_size = wcp->data_size;
|
||||
wcp->data_size = 0;
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
DEC_PROFILE_COUNT(writecache_num_write_caches);
|
||||
INC_PROFILE_COUNT(writecache_flushed_writes[reason]);
|
||||
#endif
|
||||
DO_PROFILE_DEC_INC(writecache_num_write_caches,writecache_flushed_writes[reason]);
|
||||
|
||||
DEBUG(9,("flushing write cache: fd = %d, off=%.0f, size=%u\n",
|
||||
fsp->fd, (double)wcp->offset, (unsigned int)data_size));
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
if(data_size == wcp->alloc_size)
|
||||
INC_PROFILE_COUNT(writecache_num_perfect_writes);
|
||||
DO_PROFILE_INC(writecache_num_perfect_writes);
|
||||
#endif
|
||||
|
||||
return real_write_file(fsp, wcp->data, wcp->offset, data_size);
|
||||
|
@ -1034,7 +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);
|
||||
START_PROFILE(SMBchkpth);
|
||||
|
||||
pstrcpy(name,smb_buf(inbuf) + 1);
|
||||
|
||||
|
@ -30,28 +30,6 @@ extern BOOL case_sensitive;
|
||||
Stat cache code used in unix_convert.
|
||||
*****************************************************************************/
|
||||
|
||||
static int global_stat_cache_lookups;
|
||||
static int global_stat_cache_misses;
|
||||
static int global_stat_cache_hits;
|
||||
|
||||
/****************************************************************************
|
||||
Stat cache statistics code.
|
||||
*****************************************************************************/
|
||||
|
||||
void print_stat_cache_statistics(void)
|
||||
{
|
||||
double eff;
|
||||
|
||||
if(global_stat_cache_lookups == 0)
|
||||
return;
|
||||
|
||||
eff = (100.0* (double)global_stat_cache_hits)/(double)global_stat_cache_lookups;
|
||||
|
||||
DEBUG(0,("stat cache stats: lookups = %d, hits = %d, misses = %d, \
|
||||
stat cache was %f%% effective.\n", global_stat_cache_lookups,
|
||||
global_stat_cache_hits, global_stat_cache_misses, eff ));
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
int name_len;
|
||||
char names[2]; /* This is extended via malloc... */
|
||||
@ -175,13 +153,14 @@ BOOL stat_cache_lookup(connection_struct *conn, char *name, char *dirpath,
|
||||
namelen = strlen(name);
|
||||
|
||||
*start = name;
|
||||
global_stat_cache_lookups++;
|
||||
|
||||
DO_PROFILE_INC(statcache_lookups);
|
||||
|
||||
/*
|
||||
* Don't lookup trivial valid directory entries.
|
||||
*/
|
||||
if((*name == '\0') || (strcmp(name, ".") == 0) || (strcmp(name, "..") == 0)) {
|
||||
global_stat_cache_misses++;
|
||||
DO_PROFILE_INC(statcache_misses);
|
||||
return False;
|
||||
}
|
||||
|
||||
@ -202,17 +181,17 @@ BOOL stat_cache_lookup(connection_struct *conn, char *name, char *dirpath,
|
||||
/*
|
||||
* We reached the end of the name - no match.
|
||||
*/
|
||||
global_stat_cache_misses++;
|
||||
DO_PROFILE_INC(statcache_misses);
|
||||
return False;
|
||||
}
|
||||
if((*chk_name == '\0') || (strcmp(chk_name, ".") == 0)
|
||||
|| (strcmp(chk_name, "..") == 0)) {
|
||||
global_stat_cache_misses++;
|
||||
DO_PROFILE_INC(statcache_misses);
|
||||
return False;
|
||||
}
|
||||
} else {
|
||||
scp = (stat_cache_entry *)(hash_elem->value);
|
||||
global_stat_cache_hits++;
|
||||
DO_PROFILE_INC(statcache_hits);
|
||||
trans_name = scp->names+scp->name_len+1;
|
||||
if(conn->vfs_ops.stat(conn,dos_to_unix(trans_name,False), pst) != 0) {
|
||||
/* Discard this entry - it doesn't exist in the filesystem. */
|
||||
|
@ -352,15 +352,6 @@ size_t get_nt_acl(files_struct *fsp, SEC_DESC **ppdesc)
|
||||
sid_copy( &group_sid, &global_sid_World);
|
||||
} else {
|
||||
|
||||
/*
|
||||
* If there is a VFS redirect, use it.
|
||||
*/
|
||||
|
||||
if ((fsp->is_directory || fsp->fd == -1) && fsp->conn->vfs_ops.get_nt_acl)
|
||||
return fsp->conn->vfs_ops.get_nt_acl(fsp->conn,dos_to_unix(fsp->fsp_name, False), ppdesc);
|
||||
else if (fsp->conn->vfs_ops.fget_nt_acl)
|
||||
return fsp->conn->vfs_ops.fget_nt_acl(fsp,fsp->fd, ppdesc);
|
||||
|
||||
if(fsp->is_directory || fsp->fd == -1) {
|
||||
if(vfs_stat(fsp->conn,fsp->fsp_name, &sbuf) != 0) {
|
||||
return 0;
|
||||
@ -462,15 +453,6 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd)
|
||||
SMB_STRUCT_STAT sbuf;
|
||||
BOOL got_dacl = False;
|
||||
|
||||
/*
|
||||
* If there is a VFS redirect, use it.
|
||||
*/
|
||||
|
||||
if ((fsp->is_directory || fsp->fd == -1) && fsp->conn->vfs_ops.set_nt_acl)
|
||||
return fsp->conn->vfs_ops.set_nt_acl(conn,dos_to_unix(fsp->fsp_name, False), security_info_sent, psd);
|
||||
else if (fsp->conn->vfs_ops.fset_nt_acl)
|
||||
return fsp->conn->vfs_ops.fset_nt_acl(fsp,fsp->fd, security_info_sent, psd);
|
||||
|
||||
/*
|
||||
* Get the current state of the file.
|
||||
*/
|
||||
|
@ -34,7 +34,7 @@ int vfswrap_dummy_connect(connection_struct *conn, char *service, char *user)
|
||||
return 0; /* Return >= 0 for success */
|
||||
}
|
||||
|
||||
void vfswrap_dummy_disconnect(void)
|
||||
void vfswrap_dummy_disconnect(connection_struct *conn)
|
||||
{
|
||||
}
|
||||
|
||||
@ -63,6 +63,8 @@ DIR *vfswrap_opendir(connection_struct *conn, char *fname)
|
||||
{
|
||||
DIR *result;
|
||||
|
||||
START_PROFILE(syscall_opendir);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (fname == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_opendir()\n");
|
||||
@ -70,6 +72,7 @@ DIR *vfswrap_opendir(connection_struct *conn, char *fname)
|
||||
#endif
|
||||
|
||||
result = opendir(fname);
|
||||
END_PROFILE(syscall_opendir);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -77,6 +80,8 @@ struct dirent *vfswrap_readdir(connection_struct *conn, DIR *dirp)
|
||||
{
|
||||
struct dirent *result;
|
||||
|
||||
START_PROFILE(syscall_readdir);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (dirp == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_readdir()\n");
|
||||
@ -84,6 +89,7 @@ struct dirent *vfswrap_readdir(connection_struct *conn, DIR *dirp)
|
||||
#endif
|
||||
|
||||
result = readdir(dirp);
|
||||
END_PROFILE(syscall_readdir);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -91,6 +97,8 @@ int vfswrap_mkdir(connection_struct *conn, char *path, mode_t mode)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_mkdir);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (path == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_mkdir()\n");
|
||||
@ -98,6 +106,7 @@ int vfswrap_mkdir(connection_struct *conn, char *path, mode_t mode)
|
||||
#endif
|
||||
|
||||
result = mkdir(path, mode);
|
||||
END_PROFILE(syscall_mkdir);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -105,6 +114,8 @@ int vfswrap_rmdir(connection_struct *conn, char *path)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_rmdir);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (path == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_rmdir()\n");
|
||||
@ -112,6 +123,7 @@ int vfswrap_rmdir(connection_struct *conn, char *path)
|
||||
#endif
|
||||
|
||||
result = rmdir(path);
|
||||
END_PROFILE(syscall_rmdir);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -119,6 +131,8 @@ int vfswrap_closedir(connection_struct *conn, DIR *dirp)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_closedir);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (dirp == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_closedir()\n");
|
||||
@ -126,6 +140,7 @@ int vfswrap_closedir(connection_struct *conn, DIR *dirp)
|
||||
#endif
|
||||
|
||||
result = closedir(dirp);
|
||||
END_PROFILE(syscall_closedir);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -135,6 +150,8 @@ int vfswrap_open(connection_struct *conn, char *fname, int flags, mode_t mode)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_open);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (fname == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_open()\n");
|
||||
@ -142,6 +159,7 @@ int vfswrap_open(connection_struct *conn, char *fname, int flags, mode_t mode)
|
||||
#endif
|
||||
|
||||
result = sys_open(fname, flags, mode);
|
||||
END_PROFILE(syscall_open);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -149,7 +167,10 @@ int vfswrap_close(files_struct *fsp, int fd)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_close);
|
||||
|
||||
result = close(fd);
|
||||
END_PROFILE(syscall_close);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -157,6 +178,8 @@ ssize_t vfswrap_read(files_struct *fsp, int fd, char *data, size_t n)
|
||||
{
|
||||
ssize_t result;
|
||||
|
||||
START_PROFILE_BYTES(syscall_read, n);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (data == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_read()\n");
|
||||
@ -164,6 +187,7 @@ ssize_t vfswrap_read(files_struct *fsp, int fd, char *data, size_t n)
|
||||
#endif
|
||||
|
||||
result = read(fd, data, n);
|
||||
END_PROFILE(syscall_read);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -171,6 +195,8 @@ ssize_t vfswrap_write(files_struct *fsp, int fd, char *data, size_t n)
|
||||
{
|
||||
ssize_t result;
|
||||
|
||||
START_PROFILE_BYTES(syscall_write, n);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (data == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_write()\n");
|
||||
@ -178,6 +204,7 @@ ssize_t vfswrap_write(files_struct *fsp, int fd, char *data, size_t n)
|
||||
#endif
|
||||
|
||||
result = write(fd, data, n);
|
||||
END_PROFILE(syscall_write);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -185,7 +212,10 @@ SMB_OFF_T vfswrap_lseek(files_struct *fsp, int filedes, SMB_OFF_T offset, int wh
|
||||
{
|
||||
SMB_OFF_T result;
|
||||
|
||||
START_PROFILE(syscall_lseek);
|
||||
|
||||
result = sys_lseek(filedes, offset, whence);
|
||||
END_PROFILE(syscall_lseek);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -193,6 +223,8 @@ int vfswrap_rename(connection_struct *conn, char *old, char *new)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_rename);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if ((old == NULL) || (new == NULL)) {
|
||||
smb_panic("NULL pointer passed to vfswrap_rename()\n");
|
||||
@ -200,13 +232,20 @@ int vfswrap_rename(connection_struct *conn, char *old, char *new)
|
||||
#endif
|
||||
|
||||
result = rename(old, new);
|
||||
END_PROFILE(syscall_rename);
|
||||
return result;
|
||||
}
|
||||
|
||||
int vfswrap_fsync(files_struct *fsp, int fd)
|
||||
{
|
||||
#ifdef HAVE_FSYNC
|
||||
return fsync(fd);
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_fsync);
|
||||
|
||||
result = fsync(fd);
|
||||
END_PROFILE(syscall_fsync);
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
@ -216,6 +255,8 @@ int vfswrap_stat(connection_struct *conn, char *fname, SMB_STRUCT_STAT *sbuf)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_stat);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if ((fname == NULL) || (sbuf == NULL)) {
|
||||
smb_panic("NULL pointer passed to vfswrap_stat()\n");
|
||||
@ -223,6 +264,7 @@ int vfswrap_stat(connection_struct *conn, char *fname, SMB_STRUCT_STAT *sbuf)
|
||||
#endif
|
||||
|
||||
result = sys_stat(fname, sbuf);
|
||||
END_PROFILE(syscall_stat);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -230,6 +272,8 @@ int vfswrap_fstat(files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_fstat);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (sbuf == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_fstat()\n");
|
||||
@ -237,6 +281,7 @@ int vfswrap_fstat(files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf)
|
||||
#endif
|
||||
|
||||
result = sys_fstat(fd, sbuf);
|
||||
END_PROFILE(syscall_fstat);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -244,6 +289,8 @@ int vfswrap_lstat(connection_struct *conn, char *path, SMB_STRUCT_STAT *sbuf)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_lstat);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if ((path == NULL) || (sbuf == NULL)) {
|
||||
smb_panic("NULL pointer passed to vfswrap_lstat()\n");
|
||||
@ -251,6 +298,7 @@ int vfswrap_lstat(connection_struct *conn, char *path, SMB_STRUCT_STAT *sbuf)
|
||||
#endif
|
||||
|
||||
result = sys_lstat(path, sbuf);
|
||||
END_PROFILE(syscall_lstat);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -258,6 +306,8 @@ int vfswrap_unlink(connection_struct *conn, char *path)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_unlink);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (path == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_unlink()\n");
|
||||
@ -265,6 +315,7 @@ int vfswrap_unlink(connection_struct *conn, char *path)
|
||||
#endif
|
||||
|
||||
result = unlink(path);
|
||||
END_PROFILE(syscall_unlink);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -272,6 +323,8 @@ int vfswrap_chmod(connection_struct *conn, char *path, mode_t mode)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_chmod);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (path == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_chmod()\n");
|
||||
@ -279,6 +332,7 @@ int vfswrap_chmod(connection_struct *conn, char *path, mode_t mode)
|
||||
#endif
|
||||
|
||||
result = chmod(path, mode);
|
||||
END_PROFILE(syscall_chmod);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -286,6 +340,8 @@ int vfswrap_chown(connection_struct *conn, char *path, uid_t uid, gid_t gid)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_chown);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (path == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_chown()\n");
|
||||
@ -293,35 +349,50 @@ int vfswrap_chown(connection_struct *conn, char *path, uid_t uid, gid_t gid)
|
||||
#endif
|
||||
|
||||
result = sys_chown(path, uid, gid);
|
||||
END_PROFILE(syscall_chown);
|
||||
return result;
|
||||
}
|
||||
|
||||
int vfswrap_chdir(connection_struct *conn, char *path)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_chdir);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (path == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_chdir()\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
return chdir(path);
|
||||
result = chdir(path);
|
||||
END_PROFILE(syscall_chdir);
|
||||
return result;
|
||||
}
|
||||
|
||||
char *vfswrap_getwd(connection_struct *conn, char *path)
|
||||
{
|
||||
char *result;
|
||||
|
||||
START_PROFILE(syscall_getwd);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if (path == NULL) {
|
||||
smb_panic("NULL pointer passed to vfswrap_getwd()\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
return sys_getwd(path);
|
||||
result = sys_getwd(path);
|
||||
END_PROFILE(syscall_getwd);
|
||||
return result;
|
||||
}
|
||||
|
||||
int vfswrap_utime(connection_struct *conn, char *path, struct utimbuf *times)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_utime);
|
||||
|
||||
#ifdef VFS_CHECK_NULL
|
||||
if ((path == NULL) || (times == NULL)) {
|
||||
smb_panic("NULL pointer passed to vfswrap_utime()\n");
|
||||
@ -329,6 +400,7 @@ int vfswrap_utime(connection_struct *conn, char *path, struct utimbuf *times)
|
||||
#endif
|
||||
|
||||
result = utime(path, times);
|
||||
END_PROFILE(syscall_utime);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -336,11 +408,40 @@ int vfswrap_ftruncate(files_struct *fsp, int fd, SMB_OFF_T offset)
|
||||
{
|
||||
int result;
|
||||
|
||||
START_PROFILE(syscall_ftruncate);
|
||||
|
||||
result = sys_ftruncate(fd, offset);
|
||||
END_PROFILE(syscall_ftruncate);
|
||||
return result;
|
||||
}
|
||||
|
||||
BOOL vfswrap_lock(files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
|
||||
{
|
||||
return fcntl_lock(fd, op, offset, count,type);
|
||||
BOOL result;
|
||||
|
||||
START_PROFILE(syscall_fcntl_lock);
|
||||
|
||||
result = fcntl_lock(fd, op, offset, count,type);
|
||||
END_PROFILE(syscall_fcntl_lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t vfswrap_fget_nt_acl(files_struct *fsp, int fd, SEC_DESC **ppdesc)
|
||||
{
|
||||
return get_nt_acl(fsp, ppdesc);
|
||||
}
|
||||
|
||||
size_t vfswrap_get_nt_acl(files_struct *fsp, char *name, SEC_DESC **ppdesc)
|
||||
{
|
||||
return get_nt_acl(fsp, ppdesc);
|
||||
}
|
||||
|
||||
BOOL vfswrap_fset_nt_acl(files_struct *fsp, int fd, uint32 security_info_sent, SEC_DESC *psd)
|
||||
{
|
||||
return set_nt_acl(fsp, security_info_sent, psd);
|
||||
}
|
||||
|
||||
BOOL vfswrap_set_nt_acl(files_struct *fsp, char *name, uint32 security_info_sent, SEC_DESC *psd)
|
||||
{
|
||||
return set_nt_acl(fsp, security_info_sent, psd);
|
||||
}
|
||||
|
@ -26,8 +26,8 @@ extern int DEBUGLEVEL;
|
||||
/* Some structures to help us initialise the vfs operations table */
|
||||
|
||||
struct vfs_syminfo {
|
||||
char *name;
|
||||
void *fptr;
|
||||
char *name;
|
||||
void *fptr;
|
||||
};
|
||||
|
||||
/* Default vfs hooks. WARNING: The order of these initialisers is
|
||||
@ -36,44 +36,44 @@ struct vfs_syminfo {
|
||||
|
||||
struct vfs_ops default_vfs_ops = {
|
||||
|
||||
/* Disk operations */
|
||||
/* Disk operations */
|
||||
|
||||
vfswrap_dummy_connect,
|
||||
vfswrap_dummy_disconnect,
|
||||
vfswrap_disk_free,
|
||||
vfswrap_dummy_connect,
|
||||
vfswrap_dummy_disconnect,
|
||||
vfswrap_disk_free,
|
||||
|
||||
/* Directory operations */
|
||||
/* Directory operations */
|
||||
|
||||
vfswrap_opendir,
|
||||
vfswrap_readdir,
|
||||
vfswrap_mkdir,
|
||||
vfswrap_rmdir,
|
||||
vfswrap_closedir,
|
||||
vfswrap_opendir,
|
||||
vfswrap_readdir,
|
||||
vfswrap_mkdir,
|
||||
vfswrap_rmdir,
|
||||
vfswrap_closedir,
|
||||
|
||||
/* File operations */
|
||||
/* File operations */
|
||||
|
||||
vfswrap_open,
|
||||
vfswrap_close,
|
||||
vfswrap_read,
|
||||
vfswrap_write,
|
||||
vfswrap_lseek,
|
||||
vfswrap_rename,
|
||||
vfswrap_fsync,
|
||||
vfswrap_stat,
|
||||
vfswrap_fstat,
|
||||
vfswrap_lstat,
|
||||
vfswrap_unlink,
|
||||
vfswrap_chmod,
|
||||
vfswrap_chown,
|
||||
vfswrap_chdir,
|
||||
vfswrap_getwd,
|
||||
vfswrap_utime,
|
||||
vfswrap_ftruncate,
|
||||
vfswrap_lock,
|
||||
NULL, /* The 4 security descriptor functions are not defined by default. */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
vfswrap_open,
|
||||
vfswrap_close,
|
||||
vfswrap_read,
|
||||
vfswrap_write,
|
||||
vfswrap_lseek,
|
||||
vfswrap_rename,
|
||||
vfswrap_fsync,
|
||||
vfswrap_stat,
|
||||
vfswrap_fstat,
|
||||
vfswrap_lstat,
|
||||
vfswrap_unlink,
|
||||
vfswrap_chmod,
|
||||
vfswrap_chown,
|
||||
vfswrap_chdir,
|
||||
vfswrap_getwd,
|
||||
vfswrap_utime,
|
||||
vfswrap_ftruncate,
|
||||
vfswrap_lock,
|
||||
vfswrap_fget_nt_acl,
|
||||
vfswrap_get_nt_acl,
|
||||
vfswrap_fset_nt_acl,
|
||||
vfswrap_set_nt_acl
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
|
Loading…
Reference in New Issue
Block a user