From 31739a0e1e32abfa7da166afbc5075aeab4124e6 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 16 Nov 1998 21:38:13 +0000 Subject: O_EXCL fixes for printing files & oplocks. Jeremy. (This used to be commit 4ca71c90985b1c88d92bdd0f9079a4afc263dc46) --- source3/smbd/open.c | 5 ++++- source3/smbd/oplock.c | 2 +- source3/smbd/reply.c | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source3/smbd/open.c b/source3/smbd/open.c index f9ddc969a8..c81334c8ae 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -312,7 +312,7 @@ static void open_file(files_struct *fsp,connection_struct *conn, /* this handles a bug in Win95 - it doesn't say to create the file when it should */ if (conn->printer) { - flags |= O_CREAT; + flags |= (O_CREAT|O_EXCL); } /* @@ -770,6 +770,9 @@ void open_file_shared(files_struct *fsp,connection_struct *conn,char *fname,int if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE) flags2 |= O_TRUNC; + if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL) + flags2 |= O_EXCL; + /* note that we ignore the append flag as append does not mean the same thing under dos and unix */ diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index 89a2adb900..e0e1658a78 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -1057,7 +1057,7 @@ void check_kernel_oplocks(void) return; } - if((fd = open(tmpname, O_RDWR|O_CREAT|O_TRUNC, 0600)) < 0) { + if((fd = open(tmpname, O_RDWR|O_CREAT|O_TRUNC|O_EXCL, 0600)) < 0) { DEBUG(0,("check_kernel_oplocks: Unable to open temp test file %s. Error was %s\n", tmpname, strerror(errno) )); unlink( tmpname ); diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index d466884ab6..ee0053aed0 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -2728,7 +2728,7 @@ int reply_printopen(connection_struct *conn, /* Open for exclusive use, write only. */ open_file_shared(fsp,conn,fname2, SET_DENY_MODE(DENY_ALL)|SET_OPEN_MODE(DOS_OPEN_WRONLY), - (FILE_CREATE_IF_NOT_EXIST|FILE_EXISTS_TRUNCATE), unix_mode(conn,0), 0, NULL, NULL); + (FILE_CREATE_IF_NOT_EXIST|FILE_EXISTS_FAIL), unix_mode(conn,0), 0, NULL, NULL); if (!fsp->open) { file_free(fsp); -- cgit