summaryrefslogtreecommitdiffstats
path: root/source4
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2006-09-15 16:27:55 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:18:46 -0500
commitfa257e78b5e1de1ba12e12968b1b2a6edbead7c6 (patch)
tree6fece2e18cc59a6914915f69d20a345b6701c109 /source4
parent0305907e427037134da7ee26eeb9f221d15b967f (diff)
downloadsamba-fa257e78b5e1de1ba12e12968b1b2a6edbead7c6.tar.gz
samba-fa257e78b5e1de1ba12e12968b1b2a6edbead7c6.tar.xz
samba-fa257e78b5e1de1ba12e12968b1b2a6edbead7c6.zip
r18558: Fix ShareCheck which was assuming all paths are "C:\"
Also cope with the fact that we define the FSTYPE as NTFS by default. We never use this anywhere else, so we may just change it, but just detect the fact and return DISK in share_classic for now. (This used to be commit 4daf5f7764ce69c14066f7320961c90141f0863a)
Diffstat (limited to 'source4')
-rw-r--r--source4/param/share_classic.c3
-rw-r--r--source4/rpc_server/common/share_info.c5
-rw-r--r--source4/rpc_server/srvsvc/dcesrv_srvsvc.c141
3 files changed, 135 insertions, 14 deletions
diff --git a/source4/param/share_classic.c b/source4/param/share_classic.c
index 75f66b1fd43..794a21c5bf7 100644
--- a/source4/param/share_classic.c
+++ b/source4/param/share_classic.c
@@ -84,6 +84,9 @@ static const char *sclassic_string_option(struct share_config *scfg, const char
if (lp_print_ok(s->snum)) {
return "PRINTER";
}
+ if (strcmp("NTFS", lp_fstype(s->snum)) == 0) {
+ return "DISK";
+ }
return lp_fstype(s->snum);
}
diff --git a/source4/rpc_server/common/share_info.c b/source4/rpc_server/common/share_info.c
index cb6ce8b206b..25eacf578d7 100644
--- a/source4/rpc_server/common/share_info.c
+++ b/source4/rpc_server/common/share_info.c
@@ -87,10 +87,13 @@ const char *dcesrv_common_get_share_path(TALLOC_CTX *mem_ctx, struct dcesrv_cont
return talloc_strdup(mem_ctx, "");
}
- p = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PATH, "/"));
+ p = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PATH, ""));
if (!p) {
return NULL;
}
+ if (p[0] == '\0') {
+ return p;
+ }
all_string_sub(p, "/", "\\", 0);
return talloc_asprintf(mem_ctx, "C:%s", p);
diff --git a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
index 68ab1498c2d..2ca5c8ee977 100644
--- a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
+++ b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
@@ -455,7 +455,7 @@ static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX
NTSTATUS nterr;
struct share_info *info;
struct share_context *sctx;
-
+
nterr = share_get_context(mem_ctx, &sctx);
if (!NT_STATUS_IS_OK(nterr)) {
return ntstatus_to_werror(nterr);
@@ -481,14 +481,17 @@ static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX
}
W_ERROR_HAVE_NO_MEMORY(info->type);
- /* Windows will send a path in a form of C:\example\path */
- if (r->in.info.info502->path[1] == ':') {
- info->path = talloc_strdup(info, &r->in.info.info502->path[2]);
- } else {
- info->path = talloc_strdup(info, r->in.info.info502->path);
+ if (r->in.info.info502->path && r->in.info.info502->path[0]) {
+ /* Windows will send a path in a form of C:\example\path */
+ if (strncmp(r->in.info.info502->path, "C:", 2) == 0) {
+ info->path = talloc_strdup(info, &r->in.info.info502->path[2]);
+ } else {
+ /* very strange let's try to set as is */
+ info->path = talloc_strdup(info, r->in.info.info502->path);
+ }
+ W_ERROR_HAVE_NO_MEMORY(info->path);
+ all_string_sub(info->path, "\\", "/", 0);
}
- W_ERROR_HAVE_NO_MEMORY(info->path);
- all_string_sub(info->path, "\\", "/", 0);
if (r->in.info.info502->comment && r->in.info.info502->comment[0]) {
info->comment = talloc_strdup(info, r->in.info.info502->comment);
@@ -998,7 +1001,67 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_
static WERROR srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetShareSetInfo *r)
{
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ NTSTATUS nterr;
+ struct share_context *sctx = NULL;
+ struct share_config *scfg = NULL;
+
+ ZERO_STRUCT(r->out);
+
+ /* TODO: - access check
+ */
+
+ if (strcmp("", r->in.share_name) == 0) {
+ return WERR_INVALID_PARAM;
+ }
+
+ nterr = share_get_context(mem_ctx, &sctx);
+ if (!NT_STATUS_IS_OK(nterr)) {
+ return ntstatus_to_werror(nterr);
+ }
+
+ switch (r->in.level) {
+ case 0:
+ {
+ return WERR_NOT_SUPPORTED;
+ }
+ case 1:
+ {
+ return WERR_NOT_SUPPORTED;
+ }
+ case 2:
+ {
+ return WERR_NOT_SUPPORTED;
+ }
+ case 501:
+ {
+ return WERR_NOT_SUPPORTED;
+ }
+ case 502:
+ {
+ return WERR_NOT_SUPPORTED;
+ }
+ case 1004:
+ {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ /* r->out.info.comment; */
+ return WERR_NOT_SUPPORTED;
+ }
+ case 1005:
+ {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ /* r->out.info.dfs_flags; */
+
+ return WERR_NOT_SUPPORTED;
+ }
+ default:
+ return WERR_UNKNOWN_LEVEL;
+ }
+
+ return WERR_UNKNOWN_LEVEL;
}
@@ -1018,6 +1081,13 @@ static WERROR srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLO
static WERROR srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetShareCheck *r)
{
+ NTSTATUS nterr;
+ struct share_context *sctx = NULL;
+ struct share_config *scfg = NULL;
+ char *device;
+ const char **names;
+ int count, i;
+
ZERO_STRUCT(r->out);
/* TODO: - access check
@@ -1028,12 +1098,57 @@ static WERROR srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CT
return WERR_OK;
}
- if (strcmp("C:\\", r->in.device_name) == 0) {
- r->out.type = STYPE_DISKTREE;
- return WERR_OK;
+ /* copy the path skipping C:\ */
+ if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
+ device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
+ } else {
+ /* no chance we have a share that doesn't start with C:\ */
+ return WERR_DEVICE_NOT_SHARED;
+ }
+ all_string_sub(device, "\\", "/", 0);
+
+ nterr = share_get_context(mem_ctx, &sctx);
+ if (!NT_STATUS_IS_OK(nterr)) {
+ return ntstatus_to_werror(nterr);
+ }
+
+ nterr = share_list_all(mem_ctx, sctx, &count, &names);
+ if (!NT_STATUS_IS_OK(nterr)) {
+ return ntstatus_to_werror(nterr);
+ }
+
+ for (i = 0; i < count; i++) {
+ const char *path;
+ const char *type;
+
+ nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
+ if (!NT_STATUS_IS_OK(nterr)) {
+ return ntstatus_to_werror(nterr);
+ }
+ path = share_string_option(scfg, SHARE_PATH, NULL);
+ if (!path) continue;
+
+ if (strcmp(device, path) == 0) {
+ type = share_string_option(scfg, SHARE_TYPE, NULL);
+ if (!type) continue;
+
+ if (strcmp(type, "DISK") == 0) {
+ r->out.type = STYPE_DISKTREE;
+ return WERR_OK;
+ }
+
+ if (strcmp(type, "IPC") == 0) {
+ r->out.type = STYPE_IPC;
+ return WERR_OK;
+ }
+
+ if (strcmp(type, "PRINTER") == 0) {
+ r->out.type = STYPE_PRINTQ;
+ return WERR_OK;
+ }
+ }
}
- /* TODO: - lookup the share be devicename (path) */
return WERR_DEVICE_NOT_SHARED;
}