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:
parent
c6a3ee8bab
commit
7c9d76d30c
27
source4/build/pidl/TODO
Normal file
27
source4/build/pidl/TODO
Normal 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)
|
@ -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
|
||||
|
||||
|
98
source4/libcli/dgram/browse.c
Normal file
98
source4/libcli/dgram/browse.c
Normal 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;
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
packet handling for mailslot requests
|
||||
|
||||
packet handling for mailslot requests.
|
||||
|
||||
Copyright (C) Andrew Tridgell 2005
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
@ -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"
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user