use dummy file descriptors opened on /dev/null to ensure that the smbw
authorAndrew Tridgell <tridge@samba.org>
Sun, 4 Oct 1998 04:48:17 +0000 (04:48 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 4 Oct 1998 04:48:17 +0000 (04:48 +0000)
file descriptor allocation order is identical to the kernels.

source/include/proto.h
source/lib/bitmap.c
source/smbwrapper/smbw.c
source/smbwrapper/smbw.h
source/smbwrapper/smbw_dir.c

index 932621ce9a110e28dcca535365d60b6540c7bada..78863b5984592be2482fbd3b8fba18322e632a82 100644 (file)
@@ -55,6 +55,7 @@ BOOL check_access(int sock, char *allow_list, char *deny_list);
 struct bitmap *bitmap_allocate(int n);
 BOOL bitmap_set(struct bitmap *bm, unsigned i);
 BOOL bitmap_clear(struct bitmap *bm, unsigned i);
+BOOL bitmap_query(struct bitmap *bm, unsigned i);
 int bitmap_find(struct bitmap *bm, unsigned ofs);
 
 /*The following definitions come from  lib/charcnv.c  */
index 9ccdbb420b1d9fd084d4124d12b6c6a31fd2a925..93c821c52853d9af7dd092a69aecb4b412ab99a6 100644 (file)
@@ -81,7 +81,7 @@ BOOL bitmap_clear(struct bitmap *bm, unsigned i)
 /****************************************************************************
 query a bit in a bitmap
 ****************************************************************************/
-static BOOL bitmap_query(struct bitmap *bm, unsigned i)
+BOOL bitmap_query(struct bitmap *bm, unsigned i)
 {
        if (i >= bm->n) return False;
        if (bm->b[i/32] & (1<<(i%32))) {
index d79131a8eaa12dc7bc338279693bf66283e13642..11192bedd782273991868ad894cb8cb9900a5076 100644 (file)
@@ -95,7 +95,7 @@ determine if a file descriptor is a smb one
 int smbw_fd(int fd)
 {
        if (smbw_busy) return 0;
-       return (fd >= SMBW_FD_OFFSET);
+       return smbw_file_bmap && bitmap_query(smbw_file_bmap, fd);
 }
 
 /***************************************************** 
@@ -523,16 +523,19 @@ int smbw_open(const char *fname, int flags, mode_t mode)
                goto failed;
        }
        file->srv = srv;
-       file->fd = bitmap_find(smbw_file_bmap, 0);
-
+       file->fd = open("/dev/null", O_WRONLY);
        if (file->fd == -1) {
                errno = EMFILE;
                goto failed;
        }
 
-       bitmap_set(smbw_file_bmap, file->fd);
+       if (bitmap_query(smbw_file_bmap, file->fd)) {
+               DEBUG(0,("ERROR: fd used in smbw_open\n"));
+               errno = EIO;
+               goto failed;
+       }
 
-       file->fd += SMBW_FD_OFFSET;
+       bitmap_set(smbw_file_bmap, file->fd);
 
        DLIST_ADD(smbw_files, file);
 
@@ -648,7 +651,8 @@ int smbw_close(int fd)
        }
 
 
-       bitmap_clear(smbw_file_bmap, file->fd - SMBW_FD_OFFSET);
+       bitmap_clear(smbw_file_bmap, file->fd);
+       close(file->fd);
        
        DLIST_REMOVE(smbw_files, file);
 
index 716205c1fc836010dd3f415f39cc7f009b07dc20..5fc864456e07127fe499e19a9463aa65fc3704cb 100644 (file)
@@ -21,9 +21,8 @@
 
 #define SMBW_PREFIX "/smb/"
 
-#define SMBW_FD_OFFSET 700
 #define SMBW_CLI_FD 512
-#define SMBW_MAX_OPEN 2048
+#define SMBW_MAX_OPEN 8192
 
 #define SMBW_FILE_MODE (S_IFREG | 0644)
 #define SMBW_DIR_MODE (S_IFDIR | 0755)
index 22da76eb17c3ed1eae4789bdedadf03cbd108174..c437a53e1f54a905bf43229b868c8d047865c2c6 100644 (file)
@@ -175,17 +175,23 @@ int smbw_dir_open(const char *fname)
 
        cur_dir = NULL;
        
-       fd = bitmap_find(smbw_file_bmap, 0);
+       fd = open("/dev/null", O_WRONLY);
        if (fd == -1) {
                errno = EMFILE;
                goto failed;
        }
 
+       if (bitmap_query(smbw_file_bmap, fd)) {
+               DEBUG(0,("ERROR: fd used in smbw_dir_open\n"));
+               errno = EIO;
+               goto failed;
+       }
+
        DLIST_ADD(smbw_dirs, dir);
        
        bitmap_set(smbw_file_bmap, fd);
 
-       dir->fd = fd + SMBW_FD_OFFSET;
+       dir->fd = fd;
        dir->srv = srv;
        dir->path = strdup(s);
 
@@ -241,7 +247,8 @@ int smbw_dir_close(int fd)
                return -1;
        }
 
-       bitmap_clear(smbw_file_bmap, dir->fd - SMBW_FD_OFFSET);
+       bitmap_clear(smbw_file_bmap, dir->fd);
+       close(dir->fd);
        
        DLIST_REMOVE(smbw_dirs, dir);