1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

added simple device/inode number support based on a checksum of the

filename
This commit is contained in:
Andrew Tridgell 0001-01-01 00:00:00 +00:00
parent e040047c64
commit 5674fb4e9d
4 changed files with 21 additions and 5 deletions

View 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,

View 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;

View 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;

View 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) {