summaryrefslogtreecommitdiff
path: root/usr/src/lib/libsmbfs/smb/netshareenum.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libsmbfs/smb/netshareenum.c')
-rw-r--r--usr/src/lib/libsmbfs/smb/netshareenum.c68
1 files changed, 49 insertions, 19 deletions
diff --git a/usr/src/lib/libsmbfs/smb/netshareenum.c b/usr/src/lib/libsmbfs/smb/netshareenum.c
index 4da5fd17a2..2d7f9c2c3a 100644
--- a/usr/src/lib/libsmbfs/smb/netshareenum.c
+++ b/usr/src/lib/libsmbfs/smb/netshareenum.c
@@ -36,7 +36,10 @@
*/
/* END CSTYLED */
-#pragma ident "%Z%%M% %I% %E% SMI"
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
#include <stdlib.h>
#include <string.h>
@@ -47,11 +50,11 @@
#include <netsmb/smb_lib.h>
#include <netsmb/smb_rap.h>
#include <netsmb/smb_netshareenum.h>
-#include "charsets.h"
+#include <smb/charsets.h>
#if 0 /* XXX see below */
#include <dce/exc_handling.h>
-#include <attrb.h>
+#include <rpc/attrb.h>
#include "srvsvc.h"
#endif
@@ -102,6 +105,7 @@ rpc_netshareenum(struct smb_ctx *ctx, int *entriesp, int *totalp,
return (EINVAL);
}
rpc_binding_from_string_binding(binding, &binding_h, &status);
+ rpc_string_free(&binding, (unsigned32 *)&free_status);
if (binding_status != rpc_s_ok) {
smb_error(dgettext(TEXT_DOMAIN,
"rpc_binding_from_string_binding failed with %d"), 0,
@@ -130,14 +134,12 @@ rpc_netshareenum(struct smb_ctx *ctx, int *entriesp, int *totalp,
}
strcpy(srvnamestr, "\\\\");
strcat(srvnamestr, addrstr);
-#ifdef NOTYETDEFINED
usrvnamestr = convert_utf8_to_leunicode(srvnamestr);
-#endif
- usrvnamestr = srvnamestr;
if (usrvnamestr == NULL) {
smb_error(dgettext(TEXT_DOMAIN,
"can't convert string for server address to Unicode"), 0);
rpc_binding_free(&binding_h, &free_status);
+ free(srvnamestr);
return (EINVAL);
}
if (!exceptions_initialized) {
@@ -200,16 +202,10 @@ rpc_netshareenum(struct smb_ctx *ctx, int *entriesp, int *totalp,
for (share = shares, elp = entry_list, i = 0; i < entries;
i++, share++) {
elp->type = share->shi1_type;
-#ifdef NOTYETDEFINED
elp->netname = convert_unicode_to_utf8(share->shi1_share);
-#endif
- elp->netname = share->shi1_share;
if (elp->netname == NULL)
goto fail;
-#ifdef NOTYETDEFINED
elp->remark = convert_unicode_to_utf8(share->shi1_remark);
-#endif
- elp->remark = share->shi1_remark;
if (elp->remark == NULL)
goto fail;
elp++;
@@ -261,6 +257,46 @@ cleanup_and_return:
}
#endif /* XXX */
+/*
+ * Enumerate shares using RAP
+ */
+
+struct smb_share_info_1 {
+ char shi1_netname[13];
+ char shi1_pad;
+ uint16_t shi1_type;
+ uint32_t shi1_remark; /* char * */
+};
+
+static int
+smb_rap_NetShareEnum(struct smb_ctx *ctx, int sLevel, void *pbBuffer,
+ int *cbBuffer, int *pcEntriesRead, int *pcTotalAvail)
+{
+ struct smb_rap *rap;
+ long lval = -1;
+ int error;
+ char *pass;
+ int i;
+
+ error = smb_rap_create(0, "WrLeh", "B13BWz", &rap);
+ if (error)
+ return (error);
+ smb_rap_setNparam(rap, sLevel); /* W - sLevel */
+ smb_rap_setPparam(rap, pbBuffer); /* r - pbBuffer */
+ smb_rap_setNparam(rap, *cbBuffer); /* L - cbBuffer */
+ error = smb_rap_request(rap, ctx);
+ if (error == 0) {
+ *pcEntriesRead = rap->r_entries;
+ error = smb_rap_getNparam(rap, &lval);
+ *pcTotalAvail = lval;
+ /* Copy the data length into the IN/OUT variable. */
+ *cbBuffer = rap->r_rcvbuflen;
+ }
+ error = smb_rap_error(rap, error);
+ smb_rap_done(rap);
+ return (error);
+}
+
static int
rap_netshareenum(struct smb_ctx *ctx, int *entriesp, int *totalp,
struct share_info **entries_listp)
@@ -294,10 +330,7 @@ rap_netshareenum(struct smb_ctx *ctx, int *entriesp, int *totalp,
i++, ep++) {
elp->type = letohs(ep->shi1_type);
ep->shi1_pad = '\0'; /* ensure null termination */
- elp->netname = strdup(ep->shi1_netname);
-#ifdef NOTYETDEFINED
elp->netname = convert_wincs_to_utf8(ep->shi1_netname);
-#endif
if (elp->netname == NULL)
continue; /* punt on this entry */
/*
@@ -305,10 +338,7 @@ rap_netshareenum(struct smb_ctx *ctx, int *entriesp, int *totalp,
*/
if (ep->shi1_remark >= lbound && ep->shi1_remark < rbound) {
cp = (char *)rpbuf + ep->shi1_remark;
- elp->remark = cp;
-#ifdef NOTYETDEFINED
- elp->remark = nls_str_toloc(cp, cp);
-#endif
+ elp->remark = convert_wincs_to_utf8(cp);
} else
elp->remark = NULL;
elp++;