added simple device/inode number support based on a checksum of the
authorAndrew Tridgell <tridge@samba.org>
Sat, 3 Oct 1998 13:12:08 +0000 (13:12 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sat, 3 Oct 1998 13:12:08 +0000 (13:12 +0000)
filename

source/include/proto.h
source/lib/util.c
source/libsmb/clientgen.c
source/smbwrapper/smbw.c

index 7eb3e1abc2e61b15a3af6a206dca6d53e4f79872..08d4476da95368b91fe9afb23853332adcbba6aa 100644 (file)
@@ -343,7 +343,7 @@ void dump_data(int level,char *buf1,int len);
 char *tab_depth(int depth);
 char *sid_to_string(pstring sidstr_out, DOM_SID *sid);
 BOOL string_to_sid(DOM_SID *sidout, char *sidstr);
-int str_checksum(char *s);
+int str_checksum(const char *s);
 void zero_free(void *p, size_t size);
 
 /*The following definitions come from  libsmb/clientgen.c  */
@@ -361,7 +361,7 @@ BOOL cli_api(struct cli_state *cli,
             char **rparam, int *rprcnt,
             char **rdata, int *rdrcnt);
 BOOL cli_NetWkstaUserLogon(struct cli_state *cli,char *user, char *workstation);
-BOOL cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, char *));
+BOOL cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, const char *));
 BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype,
                       void (*fn)(char *, uint32, char *));
 BOOL cli_session_setup(struct cli_state *cli, 
index c6073cf9d6909c34b9c5b9868e4ced2e3c9f3fe1..313021abb8b594aeacc31a466fcc2d9315c6ea19 100644 (file)
@@ -4809,7 +4809,7 @@ BOOL string_to_sid(DOM_SID *sidout, char *sidstr)
  *
  * ****************************************************************************
  */
-int str_checksum(char *s)
+int str_checksum(const char *s)
 {
        int res = 0;
        int c;
index 0a61a74ccea22545321e3f27077da235c97c0a3d..bd044f4e26ff69f9ab270353c3e84126b0fa2245 100644 (file)
@@ -448,7 +448,7 @@ BOOL cli_NetWkstaUserLogon(struct cli_state *cli,char *user, char *workstation)
 /****************************************************************************
 call a NetShareEnum - try and browse available connections on a host
 ****************************************************************************/
-BOOL cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, char *))
+BOOL cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, const char *))
 {
   char *rparam = NULL;
   char *rdata = NULL;
index d77f33c97e1e58b7e2543fe1d6bd9bede6f993a2..3a98143260e3e9ff3281e9e09d6b93a42cb89247 100644 (file)
@@ -30,6 +30,7 @@ struct smbw_server {
        struct cli_state cli;
        char *server_name;
        char *share_name;
+       dev_t dev;
 };
 
 struct smbw_file {
@@ -121,6 +122,13 @@ BOOL smbw_fd(int fd)
        return (fd >= SMBW_FD_OFFSET);
 }
 
+/***************************************************** 
+a crude inode number generator
+*******************************************************/
+ino_t smbw_inode(const char *name)
+{
+       return (ino_t)str_checksum(name);
+}
 
 /***************************************************** 
 remove redundent stuff from a filename
@@ -422,6 +430,8 @@ struct smbw_server *smbw_server(char *server, char *share)
 
        srv->cli = c;
 
+       srv->dev = (dev_t)(str_checksum(server) ^ str_checksum(share));
+
        srv->server_name = strdup(server);
        if (!srv->server_name) {
                errno = ENOMEM;
@@ -503,6 +513,7 @@ void smbw_setup_stat(struct stat *st, char *fname, size_t size, int mode)
        st->st_blocks = (size+511)/512;
        st->st_uid = getuid();
        st->st_gid = getgid();
+       st->st_ino = smbw_inode(fname);
 }
 
 
@@ -653,6 +664,7 @@ int smbw_dir_open(const char *fname, int flags)
        bitmap_set(file_bmap, fd);
 
        dir->fd = fd + SMBW_FD_OFFSET;
+       dir->srv = srv;
 
        DEBUG(4,("  -> %d\n", dir->count));
 
@@ -782,6 +794,8 @@ int smbw_dir_fstat(int fd, struct stat *st)
 
        smbw_setup_stat(st, "", dir->count*sizeof(struct dirent), aDIR);
 
+       st->st_dev = dir->srv->dev;
+
        return 0;
 }
 
@@ -820,6 +834,7 @@ int smbw_fstat(int fd, struct stat *st)
        st->st_atime = a_time;
        st->st_ctime = c_time;
        st->st_mtime = m_time;
+       st->st_dev = file->srv->dev;
 
        DEBUG(4,("%s - OK\n", __FUNCTION__));
 
@@ -876,6 +891,7 @@ int smbw_stat(const char *fname, struct stat *st)
        st->st_atime = time(NULL);
        st->st_ctime = m_time;
        st->st_mtime = m_time;
+       st->st_dev = srv->dev;
 
        smbw_busy--;
        return 0;
@@ -1046,13 +1062,13 @@ int smbw_getdents(unsigned int fd, struct dirent *dirp, int count)
        }
        
        while (count>=sizeof(*dirp) && (dir->offset < dir->count)) {
-               dirp->d_ino = dir->offset + 0x10000;
                dirp->d_off = (dir->offset+1)*sizeof(*dirp);
                dirp->d_reclen = sizeof(*dirp);
                /* what's going on with the -1 here? maybe d_type
                    isn't really there? */
                safe_strcpy(&dirp->d_name[-1], dir->list[dir->offset].name, 
                            sizeof(dirp->d_name)-1);
+               dirp->d_ino = smbw_inode(dir->list[dir->offset].name);
                dir->offset++;
                count -= dirp->d_reclen;
                if (dir->offset == dir->count) {