summaryrefslogtreecommitdiff
path: root/source3/libsmb/smb_share_modes.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2005-12-12 22:07:36 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:05:49 -0500
commit7d2771e758d4e8ef0adb45e55775b524de4dba9a (patch)
treef9886027f65a557ce7d76659f638591c55f17fdf /source3/libsmb/smb_share_modes.c
parent3f6d9a7b9d35331992fdd069b7752f3082fe0b1b (diff)
downloadsamba-7d2771e758d4e8ef0adb45e55775b524de4dba9a.tar.gz
r12203: Add the share path into the sharemode db. This involves
revving the minor version number for libsmbsharemodes (we now have a new _ex interface that takes the share path as well as the filename). Needed for #3303. Some code written by SATOH Fumiyasu <fumiya@samba.gr.jp> included in the changes to locking/locking.c. The smbstatus output is a bit of a mess and needs overhauling... Jeremy. (This used to be commit 9d93af713f8520ca506730dd32aa2b994937eaba)
Diffstat (limited to 'source3/libsmb/smb_share_modes.c')
-rw-r--r--source3/libsmb/smb_share_modes.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/source3/libsmb/smb_share_modes.c b/source3/libsmb/smb_share_modes.c
index 40ccf15f94..43f25cd378 100644
--- a/source3/libsmb/smb_share_modes.c
+++ b/source3/libsmb/smb_share_modes.c
@@ -255,11 +255,12 @@ int smb_get_share_mode_entries(struct smbdb_ctx *db_ctx,
* Create an entry in the Samba share mode db.
*/
-int smb_create_share_mode_entry(struct smbdb_ctx *db_ctx,
+int smb_create_share_mode_entry_ex(struct smbdb_ctx *db_ctx,
uint64_t dev,
uint64_t ino,
const struct smb_share_mode_entry *new_entry,
- const char *filename) /* Must be abolute utf8 path. */
+ const char *sharepath, /* Must be absolute utf8 path. */
+ const char *filename) /* Must be relative utf8 path. */
{
TDB_DATA db_data;
TDB_DATA locking_key = get_locking_key(dev, ino);
@@ -272,7 +273,9 @@ int smb_create_share_mode_entry(struct smbdb_ctx *db_ctx,
db_data = tdb_fetch(db_ctx->smb_tdb, locking_key);
if (!db_data.dptr) {
/* We must create the entry. */
- db_data.dptr = malloc((2*sizeof(struct share_mode_entry)) + strlen(filename) + 1);
+ db_data.dptr = malloc((2*sizeof(struct share_mode_entry)) +
+ strlen(sharepath) + 1 +
+ strlen(filename) + 1);
if (!db_data.dptr) {
return -1;
}
@@ -281,11 +284,18 @@ int smb_create_share_mode_entry(struct smbdb_ctx *db_ctx,
ld->u.s.delete_on_close = 0;
shares = (struct share_mode_entry *)(db_data.dptr + sizeof(struct share_mode_entry));
create_share_mode_entry(shares, new_entry);
+
memcpy(db_data.dptr + 2*sizeof(struct share_mode_entry),
+ sharepath,
+ strlen(sharepath) + 1);
+ memcpy(db_data.dptr + 2*sizeof(struct share_mode_entry) +
+ strlen(sharepath) + 1,
filename,
strlen(filename) + 1);
- db_data.dsize = 2*sizeof(struct share_mode_entry) + strlen(filename) + 1;
+ db_data.dsize = 2*sizeof(struct share_mode_entry) +
+ strlen(sharepath) + 1 +
+ strlen(filename) + 1;
if (tdb_store(db_ctx->smb_tdb, locking_key, db_data, TDB_INSERT) == -1) {
free(db_data.dptr);
return -1;
@@ -336,6 +346,25 @@ int smb_create_share_mode_entry(struct smbdb_ctx *db_ctx,
return 0;
}
+/*
+ * Create an entry in the Samba share mode db. Original interface - doesn't
+ * Distinguish between share path and filename. Fudge this by using a
+ * sharepath of / and a relative filename of (filename+1).
+ */
+
+int smb_create_share_mode_entry(struct smbdb_ctx *db_ctx,
+ uint64_t dev,
+ uint64_t ino,
+ const struct smb_share_mode_entry *new_entry,
+ const char *filename) /* Must be absolute utf8 path. */
+{
+ if (*filename != '/') {
+ abort();
+ }
+ return smb_create_share_mode_entry_ex(db_ctx, dev, ino, new_entry,
+ "/", &filename[1]);
+}
+
int smb_delete_share_mode_entry(struct smbdb_ctx *db_ctx,
uint64_t dev,
uint64_t ino,