include/smb.h: Added #defines for lots of things - makes our code a *lot* easier...
authorJeremy Allison <jra@samba.org>
Fri, 23 Oct 1998 00:58:28 +0000 (00:58 +0000)
committerJeremy Allison <jra@samba.org>
Fri, 23 Oct 1998 00:58:28 +0000 (00:58 +0000)
lib/util.c: Fixed Luke's set_first_token() function - should return void.
smbd/close.c: Move delete_on_close into file_fd_struct structure.
smbd/ipc.c: Changed local_machine back to fstring.
smbd/nttrans.c: Use defines for mapping share modes.
smbd/open.c: Move delete_on_close into file_fd_struct structure, added code for ALLOW_SHARE_DELETE.
smbd/reply.c: Use defines for mapping share modes.
smbd/trans2.c: Move delete_on_close into file_fd_struct structure.
Jeremy.

source/include/proto.h
source/include/smb.h
source/lib/util.c
source/smbd/close.c
source/smbd/ipc.c
source/smbd/nttrans.c
source/smbd/open.c
source/smbd/reply.c
source/smbd/trans2.c

index 6ec6f7e617ef8c498069833a01f61f406757be59..9b707adeefbc6304a709fe6d64d2fc0b94e4c263 100644 (file)
@@ -231,7 +231,7 @@ BOOL user_in_list(char *user,char *list);
 
 char *tmpdir(void);
 BOOL is_a_socket(int fd);
-BOOL set_first_token(char *ptr);
+void set_first_token(char *ptr);
 BOOL next_token(char **ptr,char *buff,char *sep, int bufsize);
 char **toktocliplist(int *ctok, char *sep);
 void set_socket_options(int fd, char *options);
index f755b81b92316717b1eebf99ed4e61fca4fc0ac3..d71d1cd1eb05343c1a98a36f4744fdd96190192b 100644 (file)
@@ -186,6 +186,47 @@ implemented */
 #define DENY_NONE 4
 #define DENY_FCB 7
 
+/* open modes */
+#define DOS_OPEN_RDONLY 0
+#define DOS_OPEN_WRONLY 1
+#define DOS_OPEN_RDWR 2
+#define DOS_OPEN_FCB 0xF
+
+/* define shifts and masks for share and open modes. */
+#define OPEN_MODE_MASK 0xF
+#define SHARE_MODE_SHIFT 4
+#define SHARE_MODE_MASK 0x7
+#define GET_OPEN_MODE(x) ((x) & OPEN_MODE_MASK)
+#define SET_OPEN_MODE(x) ((x) & OPEN_MODE_MASK)
+#define GET_DENY_MODE(x) (((x)>>SHARE_MODE_SHIFT) & SHARE_MODE_MASK)
+#define SET_DENY_MODE(x) ((x)<<SHARE_MODE_SHIFT)
+
+/* allow delete on open file mode (used by NT SMB's). */
+#define ALLOW_SHARE_DELETE (1<<15)
+#define GET_ALLOW_SHARE_DELETE(x) (((x) & ALLOW_SHARE_DELETE) ? 1 : 0)
+#define SET_ALLOW_SHARE_DELETE(x) ((x) ? ALLOW_SHARE_DELETE : 0)
+
+/* Sync on open file (not sure if used anymore... ?) */
+#define FILE_SYNC_OPENMODE (1<<14)
+#define GET_FILE_SYNC_OPENMODE(x) (((x) & FILE_SYNC_OPENMODE) ? 1 : 0)
+
+/* open disposition values */
+#define FILE_EXISTS_FAIL 0
+#define FILE_EXISTS_OPEN 1
+#define FILE_EXISTS_TRUNCATE 2
+
+/* mask for open disposition. */
+#define FILE_OPEN_MASK 0x3
+
+#define GET_FILE_OPEN_DISPOSITION(x) ((x) & FILE_OPEN_MASK)
+#define SET_FILE_OPEN_DISPOSITION(x) ((x) & FILE_OPEN_MASK)
+
+/* The above can be OR'ed with... */
+#define FILE_CREATE_IF_NOT_EXIST 0x10
+#define FILE_FAIL_IF_NOT_EXIST 0
+
+#define GET_FILE_CREATE_DISPOSITION(x) ((x) & (FILE_CREATE_IF_NOT_EXIST|FILE_FAIL_IF_NOT_EXIST))
+
 /* share types */
 #define STYPE_DISKTREE  0      /* Disk drive */
 #define STYPE_PRINTQ    1      /* Spooler queue */
@@ -433,6 +474,7 @@ typedef struct file_fd_struct
        int fd_readonly;
        int fd_writeonly;
        int real_open_flags;
+       BOOL delete_on_close;
 } file_fd_struct;
 
 /*
@@ -517,17 +559,16 @@ typedef struct files_struct
        SMB_OFF_T mmap_size;
        write_bmpx_struct *wbmpx_ptr;
        struct timeval open_time;
+       int share_mode;
        BOOL open;
        BOOL can_lock;
        BOOL can_read;
        BOOL can_write;
-       BOOL share_mode;
        BOOL print_file;
        BOOL modified;
        BOOL granted_oplock;
        BOOL sent_oplock_break;
        BOOL is_directory;
-       BOOL delete_on_close;
        char *fsp_name;
 } files_struct;
 
@@ -788,7 +829,7 @@ struct bitmap {
 #define FLAG_HIDE  2 /* options that should be hidden in SWAT */
 #define FLAG_PRINT 4 /* printing options */
 #define FLAG_GLOBAL 8 /* local options that should be globally settable in SWAT */
-#define FLAG_DEPRECATED 16 /* options that should no longer be used */
+#define FLAG_DEPRECATED 0x10 /* options that should no longer be used */
 
 #ifndef LOCKING_VERSION
 #define LOCKING_VERSION 4
index d4f939e0813ea88719d8d3753868c7ce5f3ca8e9..ced6786194dba71573d8bf090ef236cb02c00d6b 100644 (file)
@@ -125,7 +125,7 @@ BOOL is_a_socket(int fd)
 
 static char *last_ptr=NULL;
 
-BOOL set_first_token(char *ptr)
+void set_first_token(char *ptr)
 {
        last_ptr = ptr;
 }
index 981c0d77bb2a02d55c56642bea45ae81dd6329d2..2dba691a1c239b9d65bfc3aff787f079a48af248 100644 (file)
@@ -103,6 +103,7 @@ void close_file(files_struct *fsp, BOOL normal_close)
        SMB_INO_T inode = fsp->fd_ptr->inode;
        int token;
     BOOL last_reference = False;
+    BOOL delete_on_close = fsp->fd_ptr->delete_on_close;
        connection_struct *conn = fsp->conn;
 
        remove_pending_lock_requests_by_fid(fsp);
@@ -140,7 +141,7 @@ void close_file(files_struct *fsp, BOOL normal_close)
         * reference to a file.
         */
 
-    if (normal_close && last_reference && fsp->delete_on_close) {
+    if (normal_close && last_reference && delete_on_close) {
                if(dos_unlink(fsp->fsp_name) != 0)
           DEBUG(0,("close_file: file %s. Delete on close was set and unlink failed \
 with error %s\n", fsp->fsp_name, strerror(errno) ));
index d9ef53e70f20f28875702bece9a520f185c3a1f3..112a79b5ca852db7ab9ce55c6b443882af8e1461 100644 (file)
@@ -37,7 +37,7 @@
 extern int DEBUGLEVEL;
 extern int max_send;
 
-extern pstring local_machine;
+extern fstring local_machine;
 extern fstring global_myworkgroup;
 
 #define NERR_Success 0
index 62ca9fe1c8b66d35b8bd86243087339730aaa07a..8b4049cd962fdadda0b1f0acac4c892628bc7b2d 100644 (file)
@@ -317,24 +317,24 @@ static int map_create_disposition( uint32 create_disposition)
   switch( create_disposition ) {
   case FILE_CREATE:
     /* create if not exist, fail if exist */
-    ret = 0x10;
+    ret = (FILE_CREATE_IF_NOT_EXIST|FILE_EXISTS_FAIL);
     break;
   case FILE_SUPERSEDE:
   case FILE_OVERWRITE_IF:
     /* create if not exist, trunc if exist */
-    ret = 0x12;
+    ret = (FILE_CREATE_IF_NOT_EXIST|FILE_EXISTS_TRUNCATE);
     break;
   case FILE_OPEN:
     /* fail if not exist, open if exists */
-    ret = 0x1;
+    ret = (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN);
     break;
   case FILE_OPEN_IF:
     /* create if not exist, open if exists */
-    ret = 0x11;
+    ret = (FILE_CREATE_IF_NOT_EXIST|FILE_EXISTS_OPEN);
     break;
   case FILE_OVERWRITE:
     /* fail if not exist, truncate if exists */
-    ret = 0x2;
+    ret = (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_TRUNCATE);
     break;
   default:
     DEBUG(0,("map_create_disposition: Incorrect value for create_disposition = %d\n",
@@ -358,13 +358,13 @@ static int map_share_mode( char *fname, uint32 desired_access, uint32 share_acce
 
   switch( desired_access & (FILE_READ_DATA|FILE_WRITE_DATA) ) {
   case FILE_READ_DATA:
-    smb_open_mode = 0;
+    smb_open_mode = DOS_OPEN_RDONLY;
     break;
   case FILE_WRITE_DATA:
-    smb_open_mode = 1;
+    smb_open_mode = DOS_OPEN_WRONLY;
     break;
   case FILE_READ_DATA|FILE_WRITE_DATA:
-    smb_open_mode = 2;
+    smb_open_mode = DOS_OPEN_RDWR;
     break;
   }
 
@@ -386,7 +386,7 @@ static int map_share_mode( char *fname, uint32 desired_access, uint32 share_acce
     if(desired_access & (DELETE_ACCESS|WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS|
                               FILE_EXECUTE|FILE_READ_ATTRIBUTES|
                               FILE_WRITE_ATTRIBUTES|READ_CONTROL_ACCESS))
-      smb_open_mode = 0;
+      smb_open_mode = DOS_OPEN_RDONLY;
     else {
       DEBUG(0,("map_share_mode: Incorrect value %lx for desired_access to file %s\n",
              (unsigned long)desired_access, fname));
@@ -394,27 +394,37 @@ static int map_share_mode( char *fname, uint32 desired_access, uint32 share_acce
     }
   }
 
-  /* Add in the requested share mode - ignore FILE_SHARE_DELETE for now. */
+  /*
+   * Set the special bit that means allow share delete.
+   * This is held outside the normal share mode bits at 1<<15.
+   * JRA.
+   */
+
+  if(share_access & FILE_SHARE_DELETE)
+    smb_open_mode |= ALLOW_SHARE_DELETE;
+
+  /* Add in the requested share mode. */
   switch( share_access & (FILE_SHARE_READ|FILE_SHARE_WRITE)) {
   case FILE_SHARE_READ:
-    smb_open_mode |= (DENY_WRITE<<4);
+    smb_open_mode |= SET_DENY_MODE(DENY_WRITE);
     break;
   case FILE_SHARE_WRITE:
-    smb_open_mode |= (DENY_READ<<4);
+    smb_open_mode |= SET_DENY_MODE(DENY_READ);
     break;
   case (FILE_SHARE_READ|FILE_SHARE_WRITE):
-    smb_open_mode |= (DENY_NONE<<4);
+    smb_open_mode |= SET_DENY_MODE(DENY_NONE);
     break;
   case FILE_SHARE_NONE:
-    smb_open_mode |= (DENY_ALL<<4);
+    smb_open_mode |= SET_DENY_MODE(DENY_ALL);
     break;
   }
 
   /*
-   * Handle a O_SYNC request.
+   * Handle an O_SYNC request.
    */
+
   if(file_attributes & FILE_FLAG_WRITE_THROUGH)
-    smb_open_mode |= (1<<14);
+    smb_open_mode |= FILE_SYNC_OPENMODE;
 
   DEBUG(10,("map_share_mode: Mapped desired access %lx, share access %lx, file attributes %lx \
 to open_mode %x\n", (unsigned long)desired_access, (unsigned long)share_access,
index a6e29532636e374aabfdce00d25c570d0c207acd..b6b2ef5bb8a4400e1ce407adf3b5c058e9cf688b 100644 (file)
@@ -505,7 +505,6 @@ static void open_file(files_struct *fsp,connection_struct *conn,
     fsp->granted_oplock = False;
     fsp->sent_oplock_break = False;
     fsp->is_directory = False;
-    fsp->delete_on_close = False;
     fsp->conn = conn;
     /*
      * Note that the file name here is the *untranslated* name
@@ -657,8 +656,8 @@ static int check_share_mode( share_mode_entry *share, int deny_mode,
                             char *fname,
                             BOOL fcbopen, int *flags)
 {
-  int old_open_mode = share->share_mode &0xF;
-  int old_deny_mode = (share->share_mode >>4)&7;
+  int old_open_mode = GET_OPEN_MODE(share->share_mode);
+  int old_deny_mode = GET_DENY_MODE(share->share_mode);
 
   if (old_deny_mode > 4 || old_open_mode > 2)
   {
@@ -702,7 +701,8 @@ void open_file_shared(files_struct *fsp,connection_struct *conn,char *fname,int
 {
   int flags=0;
   int flags2=0;
-  int deny_mode = (share_mode>>4)&7;
+  int deny_mode = GET_DENY_MODE(share_mode);
+  BOOL allow_share_delete = GET_ALLOW_SHARE_DELETE(share_mode);
   SMB_STRUCT_STAT sbuf;
   BOOL file_existed = file_exist(fname,&sbuf);
   BOOL share_locked = False;
@@ -733,7 +733,7 @@ void open_file_shared(files_struct *fsp,connection_struct *conn,char *fname,int
     return;
   }
 
-  if ((ofun & 0x3) == 0 && file_existed)  
+  if ((GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL) && file_existed)  
   {
     DEBUG(5,("open_file_shared: create new requested for file %s and file already exists.\n",
           fname ));
@@ -741,24 +741,25 @@ void open_file_shared(files_struct *fsp,connection_struct *conn,char *fname,int
     return;
   }
       
-  if (ofun & 0x10)
+  if (GET_FILE_CREATE_DISPOSITION(ofun) == FILE_CREATE_IF_NOT_EXIST)
     flags2 |= O_CREAT;
-  if ((ofun & 0x3) == 2)
+
+  if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE)
     flags2 |= O_TRUNC;
 
   /* note that we ignore the append flag as 
      append does not mean the same thing under dos and unix */
 
-  switch (share_mode&0xF)
+  switch (GET_OPEN_MODE(share_mode))
   {
-    case 1
+    case DOS_OPEN_WRONLY
       flags = O_WRONLY; 
       break;
-    case 0xF
+    case DOS_OPEN_FCB
       fcbopen = True;
       flags = O_RDWR; 
       break;
-    case 2
+    case DOS_OPEN_RDWR
       flags = O_RDWR; 
       break;
     default:
@@ -767,7 +768,7 @@ void open_file_shared(files_struct *fsp,connection_struct *conn,char *fname,int
   }
 
 #if defined(O_SYNC)
-  if (share_mode&(1<<14)) {
+  if (GET_FILE_SYNC_OPENMODE(share_mode)) {
          flags2 |= O_SYNC;
   }
 #endif /* O_SYNC */
@@ -792,7 +793,8 @@ void open_file_shared(files_struct *fsp,connection_struct *conn,char *fname,int
     return;
   }
 
-  if (deny_mode == DENY_FCB) deny_mode = DENY_DOS;
+  if (deny_mode == DENY_FCB)
+    deny_mode = DENY_DOS;
 
   if (lp_share_modes(SNUM(conn))) 
   {
@@ -908,17 +910,19 @@ dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (dou
     switch (flags) 
     {
       case O_RDONLY:
-        open_mode = 0;
+        open_mode = DOS_OPEN_RDONLY;
         break;
       case O_RDWR:
-        open_mode = 2;
+        open_mode = DOS_OPEN_RDWR;
         break;
       case O_WRONLY:
-        open_mode = 1;
+        open_mode = DOS_OPEN_WRONLY;
         break;
     }
 
-    fsp->share_mode = (deny_mode<<4) | open_mode;
+    fsp->share_mode = SET_DENY_MODE(deny_mode) | 
+                      SET_OPEN_MODE(open_mode) | 
+                      SET_ALLOW_SHARE_DELETE(allow_share_delete);
 
     if (Access)
       (*Access) = open_mode;
@@ -971,11 +975,10 @@ dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (dou
     unlock_share_entry( conn, dev, inode, token);
 }
 
-
-
 /****************************************************************************
  Open a directory from an NT SMB call.
 ****************************************************************************/
+
 int open_directory(files_struct *fsp,connection_struct *conn,
                   char *fname, int smb_ofun, mode_t unixmode, int *action)
 {
@@ -1057,6 +1060,7 @@ int open_directory(files_struct *fsp,connection_struct *conn,
 check if the share mode on a file allows it to be deleted or unlinked
 return True if sharing doesn't prevent the operation
 ********************************************************************/
+
 BOOL check_file_sharing(connection_struct *conn,char *fname, BOOL rename_op)
 {
   int i;
@@ -1156,9 +1160,20 @@ dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (dou
           }
         }
 
-        /* someone else has a share lock on it, check to see 
-           if we can too */
-        if ((share_entry->share_mode != DENY_DOS) || (share_entry->pid != pid))
+        /* 
+         * If this is a delete request and ALLOW_SHARE_DELETE is set then allow 
+         * this to proceed. This takes precedence over share modes.
+         */
+
+        if(!rename_op && GET_ALLOW_SHARE_DELETE(share_entry->share_mode))
+          continue;
+
+        /* 
+         * Someone else has a share lock on it, check to see 
+         * if we can too.
+         */
+
+        if ((GET_DENY_MODE(share_entry->share_mode) != DENY_DOS) || (share_entry->pid != pid))
           goto free_and_exit;
 
       } /* end for */
@@ -1173,8 +1188,14 @@ dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (dou
 
   /* XXXX exactly what share mode combinations should be allowed for
      deleting/renaming? */
-  /* If we got here then either there were no share modes or
-     all share modes were DENY_DOS and the pid == getpid() */
+  /* 
+   * If we got here then either there were no share modes or
+   * all share modes were DENY_DOS and the pid == getpid() or
+   * delete access was requested and all share modes had the
+   * ALLOW_SHARE_DELETE bit set (takes precedence over other
+   * share modes).
+   */
+
   ret = True;
 
 free_and_exit:
@@ -1184,5 +1205,3 @@ free_and_exit:
     free((char *)old_shares);
   return(ret);
 }
-
-
index 8b96ff17fd053172457c251b4d4a57217b0de2c5..bc19f1a93131d30c2ddec42e4d50a8faa0610d3d 100644 (file)
@@ -1239,6 +1239,7 @@ int reply_fclose(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
 /****************************************************************************
   reply to an open
 ****************************************************************************/
+
 int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
 {
   pstring fname;
@@ -1276,8 +1277,8 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
  
   unixmode = unix_mode(conn,aARCH);
       
-  open_file_shared(fsp,conn,fname,share_mode,3,unixmode,
-                   oplock_request,&rmode,NULL);
+  open_file_shared(fsp,conn,fname,share_mode,(FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN),
+                   unixmode, oplock_request,&rmode,NULL);
 
   if (!fsp->open)
   {
@@ -1529,8 +1530,8 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
   }
 
   /* Open file in dos compatibility share mode. */
-  open_file_shared(fsp,conn,fname,(DENY_FCB<<4)|0xF, ofun, unixmode
-                   oplock_request, NULL, NULL);
+  open_file_shared(fsp,conn,fname,SET_DENY_MODE(DENY_FCB)|SET_OPEN_MODE(DOS_OPEN_FCB)
+                   ofun, unixmode, oplock_request, NULL, NULL);
   
   if (!fsp->open)
   {
@@ -1601,8 +1602,8 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
 
   /* Open file in dos compatibility share mode. */
   /* We should fail if file exists. */
-  open_file_shared(fsp,conn,fname2,(DENY_FCB<<4)|0xF, 0x10, unixmode
-                   oplock_request, NULL, NULL);
+  open_file_shared(fsp,conn,fname2,SET_DENY_MODE(DENY_FCB)|SET_OPEN_MODE(DOS_OPEN_FCB)
+                   (FILE_CREATE_IF_NOT_EXIST|FILE_EXISTS_FAIL), unixmode, oplock_request, NULL, NULL);
 
   if (!fsp->open)
   {
@@ -1702,8 +1703,10 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
   if (!has_wild) {
     pstrcat(directory,"/");
     pstrcat(directory,mask);
-    if (can_delete(directory,conn,dirtype) && !dos_unlink(directory)) count++;
-    if (!count) exists = file_exist(directory,NULL);    
+    if (can_delete(directory,conn,dirtype) && !dos_unlink(directory))
+      count++;
+    if (!count)
+      exists = file_exist(directory,NULL);    
   } else {
     void *dirptr = NULL;
     char *dname;
@@ -2675,9 +2678,8 @@ int reply_printopen(connection_struct *conn,
        }
 
        /* Open for exclusive use, write only. */
-       open_file_shared(fsp,conn,fname2,
-                        (DENY_ALL<<4)|1, 0x12, unix_mode(conn,0), 
-                        0, NULL, NULL);
+       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);
 
        if (!fsp->open) {
                file_free(fsp);
@@ -3323,6 +3325,7 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, in
 /*******************************************************************
   copy a file as part of a reply_copy
   ******************************************************************/
+
 static BOOL copy_file(char *src,char *dest1,connection_struct *conn, int ofun,
                      int count,BOOL target_is_directory)
 {
@@ -3343,12 +3346,15 @@ static BOOL copy_file(char *src,char *dest1,connection_struct *conn, int ofun,
     pstrcat(dest,p);
   }
 
-  if (!file_exist(src,&st)) return(False);
+  if (!file_exist(src,&st))
+    return(False);
 
   fsp1 = file_new();
-  if (!fsp1) return(False);
-  open_file_shared(fsp1,conn,src,(DENY_NONE<<4),
-                  1,0,0,&Access,&action);
+  if (!fsp1)
+    return(False);
+
+  open_file_shared(fsp1,conn,src,SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_RDONLY),
+                  (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN),0,0,&Access,&action);
 
   if (!fsp1->open) {
          file_free(fsp1);
@@ -3363,7 +3369,7 @@ static BOOL copy_file(char *src,char *dest1,connection_struct *conn, int ofun,
          close_file(fsp1,False);
          return(False);
   }
-  open_file_shared(fsp2,conn,dest,(DENY_NONE<<4)|1,
+  open_file_shared(fsp2,conn,dest,SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_WRONLY),
                   ofun,st.st_mode,0,&Access,&action);
 
   if (!fsp2->open) {
index 5b057410cad628b8b298463892e8a26ac388f6d9..f8d90cd87182df38610f017fb0671f5ff67455b9 100644 (file)
@@ -1658,14 +1658,11 @@ static int call_trans2setfilepathinfo(connection_struct *conn,
         if(fsp->is_directory)
           return(ERROR(ERRDOS,ERRnoaccess));
         /*
-         * TODO - check here is this means set
-         * this flag bit on all open files that
-         * reference this particular dev/inode pair.
-         * If so we'll need to search the open
-         * file entries here and set this flag on 
-         * all of them that match. JRA.
+         * Set the delete on close flag in the reference
+         * counted struct. Delete when the last reference
+         * goes away.
          */
-        fsp->delete_on_close = CVAL(pdata,0);
+        fsp->fd_ptr->delete_on_close = CVAL(pdata,0);
       } else
         return(ERROR(ERRDOS,ERRunknownlevel));
       break;