[3/4] netapi32: Add support for remote computers in NetShareAdd.
Hans Leidekker
hans at codeweavers.com
Wed Nov 13 08:35:28 CST 2013
---
dlls/netapi32/netapi32.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 124 insertions(+), 1 deletion(-)
diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c
index 9ae040e..4223379 100644
--- a/dlls/netapi32/netapi32.c
+++ b/dlls/netapi32/netapi32.c
@@ -75,10 +75,13 @@ static void *libnetapi_ctx;
static DWORD (*plibnetapi_init)(void **);
static DWORD (*plibnetapi_free)(void *);
static DWORD (*plibnetapi_set_debuglevel)(void *, const char *);
+static DWORD (*plibnetapi_set_username)(void *, const char *);
+static DWORD (*plibnetapi_set_password)(void *, const char *);
static NET_API_STATUS (*pNetApiBufferAllocate)(unsigned int, void **);
static NET_API_STATUS (*pNetApiBufferFree)(void *);
static NET_API_STATUS (*pNetServerGetInfo)(const char *, unsigned int, unsigned char **);
+static NET_API_STATUS (*pNetShareAdd)(const char *, unsigned int, unsigned char *, unsigned int *);
static NET_API_STATUS (*pNetWkstaGetInfo)(const char *, unsigned int, unsigned char **);
static BOOL libnetapi_init(void)
@@ -103,10 +106,13 @@ static BOOL libnetapi_init(void)
LOAD_FUNCPTR(libnetapi_init)
LOAD_FUNCPTR(libnetapi_free)
LOAD_FUNCPTR(libnetapi_set_debuglevel)
+ LOAD_FUNCPTR(libnetapi_set_username)
+ LOAD_FUNCPTR(libnetapi_set_password)
LOAD_FUNCPTR(NetApiBufferAllocate)
LOAD_FUNCPTR(NetApiBufferFree)
LOAD_FUNCPTR(NetServerGetInfo)
+ LOAD_FUNCPTR(NetShareAdd)
LOAD_FUNCPTR(NetWkstaGetInfo)
#undef LOAD_FUNCPTR
@@ -120,6 +126,17 @@ static BOOL libnetapi_init(void)
ERR( "Failed to set debug level %u\n", status );
goto error;
}
+ /* perform an anonymous login by default (avoids a password prompt) */
+ if ((status = plibnetapi_set_username( libnetapi_ctx, "Guest" )))
+ {
+ ERR( "Failed to set username %u\n", status );
+ goto error;
+ }
+ if ((status = plibnetapi_set_password( libnetapi_ctx, "" )))
+ {
+ ERR( "Failed to set password %u\n", status );
+ goto error;
+ }
return TRUE;
error:
@@ -204,6 +221,97 @@ static NET_API_STATUS server_getinfo( LMSTR servername, DWORD level, LPBYTE *buf
return status;
}
+struct share_info_2
+{
+ const char *shi2_netname;
+ unsigned int shi2_type;
+ const char *shi2_remark;
+ unsigned int shi2_permissions;
+ unsigned int shi2_max_uses;
+ unsigned int shi2_current_uses;
+ const char *shi2_path;
+ const char *shi2_passwd;
+};
+
+static NET_API_STATUS share_info_2_to_samba( const BYTE *buf, unsigned char **bufptr )
+{
+ struct share_info_2 *ret;
+ SHARE_INFO_2 *info = (SHARE_INFO_2 *)buf;
+ DWORD len = 0;
+ char *ptr;
+
+ if (info->shi2_netname)
+ len += WideCharToMultiByte( CP_UNIXCP, 0, info->shi2_netname, -1, NULL, 0, NULL, NULL );
+ if (info->shi2_remark)
+ len += WideCharToMultiByte( CP_UNIXCP, 0, info->shi2_remark, -1, NULL, 0, NULL, NULL );
+ if (info->shi2_path)
+ len += WideCharToMultiByte( CP_UNIXCP, 0, info->shi2_path, -1, NULL, 0, NULL, NULL );
+ if (info->shi2_passwd)
+ len += WideCharToMultiByte( CP_UNIXCP, 0, info->shi2_passwd, -1, NULL, 0, NULL, NULL );
+ if (!(ret = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret) + len )))
+ return ERROR_OUTOFMEMORY;
+
+ ptr = (char *)(ret + 1);
+ if (!info->shi2_netname) ret->shi2_netname = NULL;
+ else
+ {
+ ret->shi2_netname = ptr;
+ ptr += WideCharToMultiByte( CP_UNIXCP, 0, info->shi2_netname, -1, ptr, len, NULL, NULL );
+ }
+ ret->shi2_type = info->shi2_type;
+ if (!info->shi2_remark) ret->shi2_remark = NULL;
+ else
+ {
+ ret->shi2_remark = ptr;
+ ptr += WideCharToMultiByte( CP_UNIXCP, 0, info->shi2_remark, -1, ptr, len, NULL, NULL );
+ }
+ ret->shi2_permissions = info->shi2_permissions;
+ ret->shi2_max_uses = info->shi2_max_uses;
+ ret->shi2_current_uses = info->shi2_current_uses;
+ if (!info->shi2_path) ret->shi2_path = NULL;
+ else
+ {
+ ret->shi2_path = ptr;
+ ptr += WideCharToMultiByte( CP_UNIXCP, 0, info->shi2_path, -1, ptr, len, NULL, NULL );
+ }
+ if (!info->shi2_passwd) ret->shi2_passwd = NULL;
+ else
+ {
+ ret->shi2_passwd = ptr;
+ WideCharToMultiByte( CP_UNIXCP, 0, info->shi2_passwd, -1, ptr, len, NULL, NULL );
+ }
+ *bufptr = (unsigned char *)ret;
+ return NERR_Success;
+}
+
+static NET_API_STATUS share_info_to_samba( DWORD level, const BYTE *buf, unsigned char **bufptr )
+{
+ switch (level)
+ {
+ case 2: return share_info_2_to_samba( buf, bufptr );
+ default:
+ FIXME( "level %u not supported\n", level );
+ return ERROR_NOT_SUPPORTED;
+ }
+}
+
+static NET_API_STATUS share_add( LMSTR servername, DWORD level, LPBYTE buf, LPDWORD parm_err )
+{
+ char *server = NULL;
+ unsigned char *info;
+ NET_API_STATUS status;
+
+ if (servername && !(server = strdup_unixcp( servername ))) return ERROR_OUTOFMEMORY;
+ status = share_info_to_samba( level, buf, &info );
+ if (!status)
+ {
+ status = pNetShareAdd( server, level, info, parm_err );
+ HeapFree( GetProcessHeap(), 0, info );
+ }
+ HeapFree( GetProcessHeap(), 0, server );
+ return status;
+}
+
struct wksta_info_100
{
unsigned int wki100_platform_id;
@@ -287,6 +395,11 @@ static NET_API_STATUS server_getinfo( LMSTR servername, DWORD level, LPBYTE *buf
ERR( "\n" );
return ERROR_NOT_SUPPORTED;
}
+static NET_API_STATUS share_add( LMSTR servername, DWORD level, LPBYTE buf, LPDWORD parm_err )
+{
+ ERR( "\n" );
+ return ERROR_NOT_SUPPORTED;
+}
static NET_API_STATUS wksta_getinfo( LMSTR servername, DWORD level, LPBYTE *bufptr )
{
ERR( "\n" );
@@ -652,7 +765,17 @@ NET_API_STATUS WINAPI NetShareGetInfo(LMSTR servername, LMSTR netname,
NET_API_STATUS WINAPI NetShareAdd(LMSTR servername,
DWORD level, LPBYTE buf, LPDWORD parm_err)
{
- FIXME("Stub (%s %d %p %p)\n", debugstr_w(servername), level, buf, parm_err);
+ BOOL local = NETAPI_IsLocalComputer( servername );
+
+ TRACE("%s %d %p %p\n", debugstr_w(servername), level, buf, parm_err);
+
+ if (!local)
+ {
+ if (libnetapi_init()) return share_add( servername, level, buf, parm_err );
+ FIXME( "remote computers not supported\n" );
+ }
+
+ FIXME("%s %d %p %p\n", debugstr_w(servername), level, buf, parm_err);
return ERROR_NOT_SUPPORTED;
}
--
1.8.1.5
More information about the wine-patches
mailing list