summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2000-04-24 19:23:51 +0000
committerJeremy Allison <jra@samba.org>2000-04-24 19:23:51 +0000
commite82dbfcbe97c79b1c81915ae949bb2b1763970ba (patch)
tree6575dd984ef9bdf74807736d48fe4eee856b96df
parentb76e942639ab4d75bbf8103f6ea0822466b7615d (diff)
downloadsamba-e82dbfcbe97c79b1c81915ae949bb2b1763970ba.tar.gz
samba-e82dbfcbe97c79b1c81915ae949bb2b1763970ba.tar.bz2
samba-e82dbfcbe97c79b1c81915ae949bb2b1763970ba.zip
Now that fsp's are created on successful file open, the structure member
fsp->open is no longer needed (if an fsp pointer is valid, then it's open :-). NB for Luke, this patch also did not apply to TNG. TNG is not yet identical w.r.t file serving with HEAD. This makes it impossible for me to help maintain TNG. Please fix asap. lib/substitute.c: Removed unused variable (pidstr). Jeremy. (This used to be commit 389b700a26e8a308a0dff6fc038c38068aa0119a)
-rw-r--r--source3/include/proto.h13
-rw-r--r--source3/include/smb.h1
-rw-r--r--source3/include/smb_macros.h4
-rw-r--r--source3/lib/substitute.c1
-rw-r--r--source3/printing/printfsp.c1
-rw-r--r--source3/smbd/close.c2
-rw-r--r--source3/smbd/files.c33
-rw-r--r--source3/smbd/nttrans.c2
-rw-r--r--source3/smbd/open.c16
-rw-r--r--source3/smbd/oplock.c4
-rw-r--r--source3/smbd/reply.c2
-rw-r--r--source3/smbd/trans2.c4
12 files changed, 47 insertions, 36 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index dfa76b3995..4564ac832c 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -201,9 +201,9 @@ int smbrun(char *cmd,char *outfile,BOOL shared);
/*The following definitions come from lib/substitute.c */
+void standard_sub_basic(char *str);
void standard_sub_conn(connection_struct *conn, char *str);
void standard_sub_snum(int snum, char *str);
-void standard_sub_basic(char *str);
void standard_sub_vuser(char *str, user_struct *vuser);
void standard_sub_vsnum(char *str, user_struct *vuser, int snum);
@@ -355,6 +355,7 @@ void *memdup(void *p, size_t size);
char *myhostname(void);
char *lock_path(char *name);
char *parent_dirname(const char *path);
+int _Insure_trap_error(int a1, int a2, int a3, int a4, int a5, int a6);
/*The following definitions come from lib/util_array.c */
@@ -1173,7 +1174,7 @@ void wins_write_database(BOOL background);
/*The following definitions come from nmbd/nmbd_workgroupdb.c */
struct work_record *find_workgroup_on_subnet(struct subnet_record *subrec,
- fstring name);
+ const char *name);
struct work_record *create_workgroup_on_subnet(struct subnet_record *subrec,
fstring name, int ttl);
void update_workgroup_ttl(struct work_record *work, int ttl);
@@ -1579,6 +1580,11 @@ int cups_printername_ok(char *name);
void sysv_printer_fn(void (*fn)(char *, char *));
int sysv_printername_ok(char *name);
+/*The following definitions come from printing/printfsp.c */
+
+files_struct *print_fsp_open(connection_struct *conn,char *jobname);
+void print_fsp_end(files_struct *fsp);
+
/*The following definitions come from printing/printing.c */
BOOL print_backend_init(void);
@@ -1601,8 +1607,6 @@ int print_queue_snum(char *qname);
BOOL print_queue_pause(int snum);
BOOL print_queue_resume(int snum);
BOOL print_queue_purge(int snum);
-files_struct *print_fsp_open(connection_struct *conn,char *jobname);
-void print_fsp_end(files_struct *fsp);
/*The following definitions come from profile/profile.c */
@@ -3019,6 +3023,7 @@ void file_close_conn(connection_struct *conn);
void file_init(void);
void file_close_user(int vuid);
files_struct *file_find_dit(SMB_DEV_T dev, SMB_INO_T inode, struct timeval *tval);
+files_struct *file_find_fsp(files_struct *orig_fsp);
files_struct *file_find_di_first(SMB_DEV_T dev, SMB_INO_T inode);
files_struct *file_find_di_next(files_struct *start_fsp);
files_struct *file_find_print(void);
diff --git a/source3/include/smb.h b/source3/include/smb.h
index 854200e4cb..7fef3f40b7 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -490,7 +490,6 @@ typedef struct files_struct
int oplock_type;
int sent_oplock_break;
unsigned int num_posix_locks;
- BOOL open;
BOOL can_lock;
BOOL can_read;
BOOL can_write;
diff --git a/source3/include/smb_macros.h b/source3/include/smb_macros.h
index cc9f158af8..e7d05189cd 100644
--- a/source3/include/smb_macros.h
+++ b/source3/include/smb_macros.h
@@ -73,7 +73,7 @@
#define SMB_ASSERT_ARRAY(a,n) SMB_ASSERT((sizeof(a)/sizeof((a)[0])) >= (n))
/* these are useful macros for checking validity of handles */
-#define OPEN_FSP(fsp) ((fsp) && (fsp)->open && !(fsp)->is_directory)
+#define OPEN_FSP(fsp) ((fsp) && !(fsp)->is_directory)
#define OPEN_CONN(conn) ((conn) && (conn)->open)
#define IS_IPC(conn) ((conn) && (conn)->ipc)
#define IS_PRINT(conn) ((conn) && (conn)->printer)
@@ -150,7 +150,7 @@
#define CACHE_ERROR(w,c,e) ((w)->wr_errclass = (c), (w)->wr_error = (e), \
w->wr_discard = True, -1)
/* Macro to test if an error has been cached for this fnum */
-#define HAS_CACHED_ERROR(fsp) ((fsp)->open && (fsp)->wbmpx_ptr && \
+#define HAS_CACHED_ERROR(fsp) ((fsp)->wbmpx_ptr && \
(fsp)->wbmpx_ptr->wr_discard)
/* Macro to turn the cached error into an error packet */
#define CACHED_ERROR(fsp) cached_error_packet(inbuf,outbuf,fsp,__LINE__)
diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c
index 6f6d2a9c16..c43c133d6a 100644
--- a/source3/lib/substitute.c
+++ b/source3/lib/substitute.c
@@ -200,7 +200,6 @@ void standard_sub_basic(char *str)
static void standard_sub_advanced(int snum, char *user, char *connectpath, gid_t gid, char *str)
{
char *p, *s, *home;
- fstring pidstr;
struct passwd *pass;
for (s=str; (p=strchr(s, '%'));s=p) {
diff --git a/source3/printing/printfsp.c b/source3/printing/printfsp.c
index 72cd006e20..41635561a6 100644
--- a/source3/printing/printfsp.c
+++ b/source3/printing/printfsp.c
@@ -56,7 +56,6 @@ files_struct *print_fsp_open(connection_struct *conn,char *jobname)
fsp->vuid = current_user.vuid;
fsp->size = 0;
fsp->pos = -1;
- fsp->open = True;
fsp->can_lock = True;
fsp->can_read = False;
fsp->can_write = True;
diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index ec28ff3540..03f6aaf81a 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -72,8 +72,8 @@ void close_filestruct(files_struct *fsp)
flush_write_cache(fsp, CLOSE_FLUSH);
- fsp->open = False;
fsp->is_directory = False;
+ fsp->stat_open = False;
conn->num_files_open--;
if(fsp->wbmpx_ptr) {
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 6c0465097b..e644f52669 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -120,7 +120,7 @@ void file_close_conn(connection_struct *conn)
for (fsp=Files;fsp;fsp=next) {
next = fsp->next;
- if (fsp->conn == conn && fsp->open) {
+ if (fsp->conn == conn) {
close_file(fsp,False);
}
}
@@ -173,7 +173,7 @@ void file_close_user(int vuid)
for (fsp=Files;fsp;fsp=next) {
next=fsp->next;
- if ((fsp->vuid == vuid) && fsp->open) {
+ if (fsp->vuid == vuid) {
close_file(fsp,False);
}
}
@@ -191,8 +191,7 @@ files_struct *file_find_dit(SMB_DEV_T dev, SMB_INO_T inode, struct timeval *tval
files_struct *fsp;
for (fsp=Files;fsp;fsp=fsp->next,count++) {
- if (fsp->open &&
- fsp->fd != -1 &&
+ if (fsp->fd != -1 &&
fsp->dev == dev &&
fsp->inode == inode &&
(tval ? (fsp->open_time.tv_sec == tval->tv_sec) : True ) &&
@@ -208,6 +207,22 @@ files_struct *file_find_dit(SMB_DEV_T dev, SMB_INO_T inode, struct timeval *tval
}
/****************************************************************************
+ Check if an fsp still exists.
+****************************************************************************/
+
+files_struct *file_find_fsp(files_struct *orig_fsp)
+{
+ files_struct *fsp;
+
+ for (fsp=Files;fsp;fsp=fsp->next) {
+ if (fsp == orig_fsp)
+ return fsp;
+ }
+
+ return NULL;
+}
+
+/****************************************************************************
Find the first fsp given a device and inode.
****************************************************************************/
@@ -216,8 +231,7 @@ files_struct *file_find_di_first(SMB_DEV_T dev, SMB_INO_T inode)
files_struct *fsp;
for (fsp=Files;fsp;fsp=fsp->next) {
- if (fsp->open &&
- fsp->fd != -1 &&
+ if ( fsp->fd != -1 &&
fsp->dev == dev &&
fsp->inode == inode )
return fsp;
@@ -235,8 +249,7 @@ files_struct *file_find_di_next(files_struct *start_fsp)
files_struct *fsp;
for (fsp = start_fsp->next;fsp;fsp=fsp->next) {
- if (fsp->open &&
- fsp->fd != -1 &&
+ if ( fsp->fd != -1 &&
fsp->dev == start_fsp->dev &&
fsp->inode == start_fsp->inode )
return fsp;
@@ -253,7 +266,7 @@ files_struct *file_find_print(void)
files_struct *fsp;
for (fsp=Files;fsp;fsp=fsp->next) {
- if (fsp->open && fsp->print_file) return fsp;
+ if (fsp->print_file) return fsp;
}
return NULL;
@@ -269,7 +282,7 @@ void file_sync_all(connection_struct *conn)
for (fsp=Files;fsp;fsp=next) {
next=fsp->next;
- if (fsp->open && (conn == fsp->conn) && (fsp->fd != -1)) {
+ if ((conn == fsp->conn) && (fsp->fd != -1)) {
conn->vfs_ops.fsync(fsp->fd);
}
}
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index ca9522ecfc..b4ae0f61a9 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -1708,7 +1708,7 @@ static int call_nt_transact_notify_change(connection_struct *conn,
if(!fsp)
return(ERROR(ERRDOS,ERRbadfid));
- if((!fsp->open) || (!fsp->is_directory) || (conn != fsp->conn))
+ if((!fsp->is_directory) || (conn != fsp->conn))
return(ERROR(ERRDOS,ERRbadfid));
/*
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index d2368aa44d..353e20df8a 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -90,8 +90,7 @@ static BOOL open_file(files_struct *fsp,connection_struct *conn,
int accmode = (flags & O_ACCMODE);
SMB_STRUCT_STAT sbuf;
- fsp->open = False;
- fsp->fd = 0;
+ fsp->fd = -1;
fsp->oplock_type = NO_OPLOCK;
errno = EPERM;
@@ -155,7 +154,6 @@ static BOOL open_file(files_struct *fsp,connection_struct *conn,
fsp->vuid = current_user.vuid;
fsp->size = 0;
fsp->pos = -1;
- fsp->open = True;
fsp->can_lock = True;
fsp->can_read = ((flags & O_WRONLY)==0);
fsp->can_write = ((flags & (O_WRONLY|O_RDWR))!=0);
@@ -508,6 +506,7 @@ files_struct *open_file_shared(connection_struct *conn,char *fname,int share_mod
SMB_INO_T inode = 0;
int num_share_modes = 0;
BOOL all_current_opens_are_level_II = False;
+ BOOL fsp_open = False;
files_struct *fsp = NULL;
int open_mode=0;
uint16 port = 0;
@@ -524,7 +523,6 @@ files_struct *open_file_shared(connection_struct *conn,char *fname,int share_mod
if(!fsp)
return NULL;
- fsp->open = False;
fsp->fd = -1;
DEBUG(10,("open_file_shared: fname = %s, share_mode = %x, ofun = %x, mode = %o, oplock request = %d\n",
@@ -638,14 +636,14 @@ files_struct *open_file_shared(connection_struct *conn,char *fname,int share_mod
DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
flags,flags2,(int)mode));
- fsp->open = open_file(fsp,conn,fname,flags|(flags2&~(O_TRUNC)),mode);
+ fsp_open = open_file(fsp,conn,fname,flags|(flags2&~(O_TRUNC)),mode);
- if (!fsp->open && (flags == O_RDWR) && (errno != ENOENT) && fcbopen) {
- if((fsp->open = open_file(fsp,conn,fname,O_RDONLY,mode)) == True)
+ if (!fsp_open && (flags == O_RDWR) && (errno != ENOENT) && fcbopen) {
+ if((fsp_open = open_file(fsp,conn,fname,O_RDONLY,mode)) == True)
flags = O_RDONLY;
}
- if (!fsp->open) {
+ if (!fsp_open) {
if(file_existed)
unlock_share_entry(conn, dev, inode);
file_free(fsp);
@@ -790,7 +788,6 @@ files_struct *open_file_stat(connection_struct *conn,
fsp->vuid = current_user.vuid;
fsp->size = 0;
fsp->pos = -1;
- fsp->open = True;
fsp->can_lock = False;
fsp->can_read = False;
fsp->can_write = False;
@@ -915,7 +912,6 @@ files_struct *open_directory(connection_struct *conn,
fsp->vuid = current_user.vuid;
fsp->size = 0;
fsp->pos = -1;
- fsp->open = True;
fsp->can_lock = True;
fsp->can_read = False;
fsp->can_write = False;
diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c
index e794d2d923..28ab29d027 100644
--- a/source3/smbd/oplock.c
+++ b/source3/smbd/oplock.c
@@ -1304,10 +1304,10 @@ BOOL attempt_close_oplocked_file(files_struct *fsp)
DEBUG(5,("attempt_close_oplocked_file: checking file %s.\n", fsp->fsp_name));
- if (fsp->open && EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && !fsp->sent_oplock_break && (fsp->fd != -1)) {
+ if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && !fsp->sent_oplock_break && (fsp->fd != -1)) {
/* Try and break the oplock. */
if (oplock_break(fsp->dev, fsp->inode, &fsp->open_time, True)) {
- if(!fsp->open) /* Did the oplock break close the file ? */
+ if(file_find_fsp(fsp) == NULL) /* Did the oplock break close the file ? */
return True;
}
}
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index baff8f2ac8..a020f5eb3b 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -2751,7 +2751,7 @@ 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->open || (fsp->conn != conn))
+ if(!fsp || (fsp->conn != conn))
return(ERROR(ERRDOS,ERRbadfid));
if(HAS_CACHED_ERROR(fsp)) {
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 7a5276aa42..a30038a431 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -1296,7 +1296,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
DEBUG(3,("call_trans2qfilepathinfo: TRANSACT2_QFILEINFO: level = %d\n", info_level));
- if(fsp && fsp->open && (fsp->is_directory || fsp->stat_open)) {
+ if(fsp && (fsp->is_directory || fsp->stat_open)) {
/*
* This is actually a QFILEINFO on a directory
* handle (returned from an NT SMB). NT5.0 seems
@@ -1579,7 +1579,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn,
fsp = file_fsp(params,0);
info_level = SVAL(params,2);
- if(fsp && fsp->open && (fsp->is_directory || fsp->stat_open)) {
+ if(fsp && (fsp->is_directory || fsp->stat_open)) {
/*
* This is actually a SETFILEINFO on a directory
* handle (returned from an NT SMB). NT5.0 seems