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

r7377: Integrate browse service stuff more nicely

Add notes on mailslots
Add TODO list for pidl, including some plans on switching
over to using [string] attributes for pidl.
(This used to be commit fca195ce07)
This commit is contained in:
Jelmer Vernooij 2005-06-07 22:09:18 +00:00 committed by Gerald (Jerry) Carter
parent c6a3ee8bab
commit 7c9d76d30c
6 changed files with 243 additions and 114 deletions

27
source4/build/pidl/TODO Normal file
View File

@ -0,0 +1,27 @@
- Fix string support.
This would make strings a special kind of arrays flagged by the
[string] attribute. Pidl itself would support a couple of extra
attributes for it's own use while being compatible with other IDL
compilers.
Proposed extensions for pidl:
[convert(t)] attribute for forcing conversions from CH_UCS2, etc to UTF8
[noterm] attribute
[nullterm] attribute
The various flags for strings would change as follows:
LIBNDR_FLAG_STR_ASCII -> [convert(CH_ASCII)]
LIBNDR_FLAG_STR_LEN4 -> optionally [length_is()]
LIBNDR_FLAG_STR_SIZE4 -> [size_is()] or if needed [conformant]
LIBNDR_FLAG_STR_NOTERM -> [noterm]
LIBNDR_FLAG_STR_NULLTERM -> [nullterm]
LIBNDR_FLAG_STR_SIZE2 -> uint16 length; [string] char data[length]
LIBNDR_FLAG_STR_BYTESIZE -> ???
LIBNDR_FLAG_STR_FIXLEN32 -> [32]
LIBNDR_FLAG_STR_CONFORMANT -> no longer needed
LIBNDR_FLAG_STR_CHARLEN -> ???
LIBNDR_FLAG_STR_UTF8 -> Nothing (but UCS2 has [convert(CH_UCS2)]
LIBNDR_FLAG_STR_FIXLEN15 -> [15]
- True multiple dimension array / strings in arrays support (closely related to
things specified above)

View File

@ -43,7 +43,8 @@ ADD_OBJ_FILES = \
libcli/dgram/dgramsocket.o \
libcli/dgram/mailslot.o \
libcli/dgram/netlogon.o \
libcli/dgram/ntlogon.o
libcli/dgram/ntlogon.o \
libcli/dgram/browse.o
NOPROTO=YES
REQUIRED_SUBSYSTEMS = LIBCLI_NBT

View File

@ -0,0 +1,98 @@
/*
Unix SMB/CIFS implementation.
handling for browsing dgram requests
Copyright (C) Jelmer Vernooij 2005
Heavily based on ntlogon.c
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "includes.h"
#include "lib/events/events.h"
#include "libcli/nbt/libnbt.h"
#include "libcli/dgram/libdgram.h"
#include "lib/socket/socket.h"
#include "librpc/gen_ndr/ndr_nbt.h"
NTSTATUS dgram_mailslot_browse_send(struct nbt_dgram_socket *dgmsock,
struct nbt_name *dest_name, const char *dest_address, int dest_port,
struct nbt_name *src_name, struct nbt_browse_packet *request)
{
NTSTATUS status;
DATA_BLOB blob;
TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
status = ndr_push_struct_blob(&blob, tmp_ctx, request,
(ndr_push_flags_fn_t)ndr_push_nbt_browse_packet);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(tmp_ctx);
return status;
}
status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE,
NBT_MAILSLOT_BROWSE,
dest_name, dest_address, dest_port,
src_name, &blob);
talloc_free(tmp_ctx);
return status;
}
NTSTATUS dgram_mailslot_browse_reply(struct nbt_dgram_socket *dgmsock,
struct nbt_dgram_packet *request, const char *mailslot_name,
struct nbt_browse_packet *reply)
{
NTSTATUS status;
DATA_BLOB blob;
TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
struct nbt_name myname;
status = ndr_push_struct_blob(&blob, tmp_ctx, reply,
(ndr_push_flags_fn_t)ndr_push_nbt_browse_packet);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(tmp_ctx);
return status;
}
make_nbt_name_client(&myname, lp_netbios_name());
status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE,
mailslot_name,
&request->data.msg.source_name,
request->source, request->src_port,
&myname, &blob);
talloc_free(tmp_ctx);
return status;
}
NTSTATUS dgram_mailslot_browse_parse(struct dgram_mailslot_handler *dgmslot,
TALLOC_CTX *mem_ctx, struct nbt_dgram_packet *dgram,
struct nbt_browse_packet *pkt)
{
DATA_BLOB data = dgram_mailslot_data(dgram);
NTSTATUS status;
status = ndr_pull_struct_blob(&data, mem_ctx, pkt,
(ndr_pull_flags_fn_t)ndr_pull_nbt_browse_packet);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("Failed to parse browse packet of length %d\n",
data.length));
if (DEBUGLVL(10)) {
file_save("browse.dat", data.data, data.length);
}
}
return status;
}

View File

@ -1,7 +1,7 @@
/*
Unix SMB/CIFS implementation.
packet handling for mailslot requests
packet handling for mailslot requests.
Copyright (C) Andrew Tridgell 2005
@ -20,6 +20,18 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
This implements "Class 2 mailslots", i.e. the communication mechanism
used for all mailslot packets smaller then 425 bytes.
"Class 1 mailslots" (which use SMB) are used for messages larger
then 426 bytes and are supported on some systems. These are not implemented
in Samba4 yet, as there don't appear to be any core services that use
them.
425 and 426-byte sized messages are not supported at all.
*/
#include "includes.h"
#include "lib/events/events.h"
#include "dlinklist.h"

View File

@ -1,111 +0,0 @@
#include "idl_types.h"
/*
IDL structures for Browse service over mailslot operations
*/
[ uuid("1-2-3-4"),
depends(security)
] interface browse
{
const string browse_mailslot = "\\MAILSLOT\\BROWSE";
typedef enum {
HostAnnouncement = 1,
AnnouncementRequest = 2,
Election = 8,
GetBackupListReq = 9,
GetBackupListResp = 10,
BecomeBackup = 11,
DomainAnnouncment = 12,
MasterAnnouncement = 13,
ResetBrowserState = 14,
LocalMasterAnnouncement = 15
} brow_opcodes;
typedef bitmap {
SV_TYPE_WORKSTATION = 0x00000001,
SV_TYPE_SERVER = 0x00000002,
SV_TYPE_SQLSERVER = 0x00000004,
SV_TYPE_DOMAIN_CTRL = 0x00000008,
SV_TYPE_DOMAIN_BAKCTRL = 0x00000010,
SV_TYPE_TIME_SOURCE = 0x00000020,
SV_TYPE_AFP = 0x00000040,
SV_TYPE_NOVELL = 0x00000080,
SV_TYPE_DOMAIN_MEMBER = 0x00000100,
SV_TYPE_PRINTQ_SERVER = 0x00000200,
SV_TYPE_DIALIN_SERVER = 0x00000400,
SV_TYPE_XENIX_SERVER = 0x00000800,
SV_TYPE_NT = 0x00001000,
SV_TYPE_POTENTIAL_BROWSER = 0x00010000,
SV_TYPE_BACKUP_BROWSER = 0x00020000,
SV_TYPE_MASTER_BROWSER = 0x00040000,
SV_TYPE_DOMAIN_MASTER = 0x00080000,
SV_TYPE_LOCAL_LIST_ONLY = 0x40000000,
SV_TYPE_DOMAIN_ENUM = 0x80000000
} brow_server_type;
typedef struct {
uint8 update_count;
uint32 ttl;
char name[16];
uint8 os_major;
uint8 os_minor;
uint32 server_type;
astring comment;
} host_announcement;
typedef struct {
uint8 unknown;
astring ResponseComputerName;
} request_announcement;
typedef struct {
uint8 count;
uint32 token;
} backup_list_request;
typedef struct {
uint8 count;
uint32 token;
astring BackupServerList[count];
} backup_list_response;
typedef struct {
astring BrowserToPromote;
} become_backup;
typedef struct {
uint8 version;
uint32 criteria;
uint32 time_up; /* In milliseconds */
uint32 reserved; /* Must be zero */
astring ServerName;
} election_request;
typedef struct {
uint8 options;
} reset_state;
typedef struct {
astring MasterBrowserServerName;
} master_announcement;
typedef [nodiscriminant] union {
[case(HostAnnouncement)] host_announcement host_annoucement;
[case(AnnouncementRequest)] request_announcement announcement_request;
[case(Election)] election_request election_request;
[case(GetBackupListReq)] backup_list_request backup_list_request;
[case(GetBackupListResp)] backup_list_response backup_list_response;
[case(BecomeBackup)] become_backup become_backup;
[case(DomainAnnouncement)] master_announcement domain_announcement;
[case(MasterAnnouncement)] master_announcement master_announcement;
[case(ResetBrowserState)] reset_state reset_browser_state;
[case(LocalMasterAnnouncement)] master_announcement local_master_announcement;
} browse_payload;
typedef [public] struct {
browse_opcode opcode;
browse_payload payload;
} browse_packet;
}

View File

@ -572,4 +572,106 @@
nbt_ntlogon_command command;
[switch_is(command)] nbt_ntlogon_request req;
} nbt_ntlogon_packet;
/*******************************************/
/* \MAILSLOT\BROWSE mailslot requests */
typedef enum {
HostAnnouncement = 1,
AnnouncementRequest = 2,
Election = 8,
GetBackupListReq = 9,
GetBackupListResp = 10,
BecomeBackup = 11,
DomainAnnouncement = 12,
MasterAnnouncement = 13,
ResetBrowserState = 14,
LocalMasterAnnouncement = 15
} nbt_browse_opcode;
typedef bitmap {
SV_TYPE_WORKSTATION = 0x00000001,
SV_TYPE_SERVER = 0x00000002,
SV_TYPE_SQLSERVER = 0x00000004,
SV_TYPE_DOMAIN_CTRL = 0x00000008,
SV_TYPE_DOMAIN_BAKCTRL = 0x00000010,
SV_TYPE_TIME_SOURCE = 0x00000020,
SV_TYPE_AFP = 0x00000040,
SV_TYPE_NOVELL = 0x00000080,
SV_TYPE_DOMAIN_MEMBER = 0x00000100,
SV_TYPE_PRINTQ_SERVER = 0x00000200,
SV_TYPE_DIALIN_SERVER = 0x00000400,
SV_TYPE_XENIX_SERVER = 0x00000800,
SV_TYPE_NT = 0x00001000,
SV_TYPE_POTENTIAL_BROWSER = 0x00010000,
SV_TYPE_BACKUP_BROWSER = 0x00020000,
SV_TYPE_MASTER_BROWSER = 0x00040000,
SV_TYPE_DOMAIN_MASTER = 0x00080000,
SV_TYPE_LOCAL_LIST_ONLY = 0x40000000,
SV_TYPE_DOMAIN_ENUM = 0x80000000
} nbt_browse_server_type;
typedef struct {
uint8 update_count;
uint32 ttl;
uint8 name[16];
uint8 os_major;
uint8 os_minor;
uint32 server_type;
astring comment;
} nbt_browse_host_announcement;
typedef struct {
uint8 unknown;
astring ResponseComputerName;
} nbt_browse_request_announcement;
typedef struct {
uint8 count;
uint32 token;
} nbt_browse_backup_list_request;
typedef struct {
uint8 count;
uint32 token;
nbt_name BackupServerList[count];
} nbt_browse_backup_list_response;
typedef struct {
astring BrowserToPromote;
} nbt_browse_become_backup;
typedef struct {
uint8 version;
uint32 criteria;
uint32 time_up; /* In milliseconds */
uint32 reserved; /* Must be zero */
astring ServerName;
} nbt_browse_election_request;
typedef struct {
uint8 options;
} nbt_browse_reset_state;
typedef struct {
astring MasterBrowserServerName;
} nbt_browse_master_announcement;
typedef [nodiscriminant] union {
[case(HostAnnouncement)] nbt_browse_host_announcement host_annoucement;
[case(AnnouncementRequest)] nbt_browse_request_announcement announcement_request;
[case(Election)] nbt_browse_election_request election_request;
[case(GetBackupListReq)] nbt_browse_backup_list_request backup_list_request;
[case(GetBackupListResp)] nbt_browse_backup_list_response backup_list_response;
[case(BecomeBackup)] nbt_browse_become_backup become_backup;
[case(DomainAnnouncement)] nbt_browse_master_announcement domain_announcement;
[case(MasterAnnouncement)] nbt_browse_master_announcement master_announcement;
[case(ResetBrowserState)] nbt_browse_reset_state reset_browser_state;
[case(LocalMasterAnnouncement)] nbt_browse_master_announcement local_master_announcement;
} nbt_browse_payload;
typedef [public,flag(NDR_NOALIGN)] struct {
nbt_browse_opcode opcode;
nbt_browse_payload payload;
} nbt_browse_packet;
}